说说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里。