标签存档: Js类及对象创建

Javascript类及对象创建

关于js里的类与c#等的区别,不在这里提,只说一下怎么创建类及对象。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也会被改动,这样肯定不行。

啊,不是说js里创建类和对象很简单嘛,怎么还有这么多问题呀!别急,其实第一个例子已经成功达到目的了,我们这不是在寻找更合理的创建对象的方法嘛。

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

这有一种,学名叫啥我忘了,似乎应该有个学名吧。其实就是前面两种方法的混合使用,用第一种方法定义对象的属性,用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);//输出A

恩,就这样。既不浪费,又可以针对具体对象做修改。还行,嚎~

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

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

好久没写了,不知道容不容易看懂。上面仅仅是我的理解,哪里有问题,忘高手指正。