什么是在JavaScript对象中使用构造函数的优势?

时间:2009-06-19 06:27:26

标签: javascript optimization function constructor

使用像这样的构造函数有什么好处:

var MyLibrary = new function(){
    var self = this;
    self.MyLibrary = function(){
         // init code
    }

}

而不是简单地在对象中编写代码?

var MyLibrary = new function(){
    // init code
}

2 个答案:

答案 0 :(得分:3)

好吧,如果您使用原型继承来创建新类,那么您将执行以下操作:

function MyBaseClass() {
    // common stuff here
}

function MySubClass() {
    // subclass-specific stuff here
}

MySubClass.prototype = new MyBaseClass();

建立继承链需要最后一行。但是,它也有执行MyBaseClass主体的副作用,这可能会导致问题(特别是如果MyBaseClass函数需要参数)。

如果您不希望发生这种情况,请执行以下操作:

function MyBaseClass() {
    this.init = function() {
        // initialisation stuff here
    }
    // common stuff here
}

function MySubClass() {
    // subclass-specific stuff here
    this.init();
}

MySubClass.prototype = new MyBaseClass();

init中的初始化代码现在仅在您创建MySubClass的实例时执行。

答案 1 :(得分:3)

这些都不是正确的,虽然第二个可能有用,但实际上并不是一个对象,更像是单身(但是以一种奇怪的方式)。这是一个带有构造函数的类的示例:

// Class & Constructor definition
function Rectangle(w,h) {
    this.width = w;
    this.height = h;
}

// Now your class methods go on the prototype object
Rectangle.prototype.area = function() {
    return this.width * this.height;
}

现在使用这个类:

var myRect = new Rectangle(3,4);
myRect.area();

您还可以通过使用匿名函数而不是命名函数将“构造函数”保存到var来定义类:

// Class & Constructor definition
var Rectangle = function(w,h) {
    this.width = w;
    this.height = h;
}

// Now your class methods go on the prototype object
Rectangle.prototype.area = function() {
    return this.width * this.height;
}