说说javascript类及对象创建的几种方法

js里创建类及对象很简单,例如:

function Room(c){
 this.windows = c; 
    this.owner = "A"; 
    this.show = function(){alert(this.windows);     }
 }  
var r1 = new Room(4);
var r2 = new Room(2);

像这样创建对象时,每次都会创建一个show()函数的副本,但其实r1和r2两个对象是可以共享同一个show()的,这样就浪费了内存。

当然,也有不浪费内存的写法,这就要用到对象的prototype属性,可以把它看成创建新对象所依赖的原型。当new时,原型的所有属性都被赋予新创建的对象,新对象中只有一个指向类中某个函数的指针,不会再生成一个副本。如下:

function Room(){ }; 
Room.prototype.windows = 2; 
Room.prototype.owner = "A"; 
Room.prototype.show = function(){     alert(this.windows); } 
 var r1 = new Room(); 
var r2 = new Room();

这样虽然没浪费内存,但当你想给r1做一些改动,比如,r1.owner=”B”,这时,r2也会被改动,这样肯定不行。

我们寻找更合理的创建对象的方法。

说说我常用的两种创建对象的简单方法,不知道是不是最好的,依我目前所知,应该是最简单通用的了。

这有一种,学名叫啥我忘了,似乎应该有个学名吧。其实就是前面两种方法的混合使用,用第一种方法定义对象的属性,用prototype原型链定义对象的方法。再看上面那个例子:

function Room(c){
 this.windows = c;
 this.owner = "A"; 
} 
Room.prototype.show = function(){alert(this.windows); } 
 var r1 = new Room(4); 
var r2 = new Room(2); 
r1.owner = "B"; 
alert(r1.owner);//输出B
 alert(r2.owner);//

这样既不浪费,又可以针对具体对象做修改。

再来看看另外一种方法,直接创建实例对象。如下:

Room={
      init:function(c){this.windows = c;this.owner = "A";  },  
      show:function(){         alert(this.windows);     } 
     } 
Room.init(4); 
Room.owner = "B"; 
Room.show();

这种方式直接创建了一个对象,自然也就不用new了。不会像第一个例子那样浪费内存,也不会出现第二个例子那样情况。

在大多数情况下,我会使用第3,4个例子的方式创建类及对象,简单,通用,雅俗共赏。至于怎么用这两种方式?这就要看情况了。举例来说,页面里有一个菜单栏menu,菜单栏里会有多个菜单项menuItem,这样我就会像第四个例子那样创建一个menu对象,然后像第三个例子那样创建多个menuItem对象,并将其添加到menu里。