JavaScript对象创建模式

时间:2012-02-21 05:41:12

标签: javascript constructor design-patterns object-literal

我在这里读了一篇文章:

http://javascriptweblog.wordpress.com/2010/03/16/five-ways-to-create-objects/

它讲述了创建对象的五种方法。但我的问题是他的方式之一(3)是:

myApp.Notepad = function(defaultFont) {
    var  that = {};
    that.writeable = true;
    that.font = defaultFont;
    that.setFont = function(theFont) {
        that.font = theFont;
    }
    return that;
}

myApp.notepad1 =  myApp.Notepad('helvetica');

根据作者的说法,我们可以在需要多个实例时使用它,我们可以使用从3(上)到5的任何模式。

但据我所知,我们确实需要使用this关键字来反映新创建的实例并仅引用该实例。但是,上面的作者使用了that个对象而不是this,并且上面没有使用new个关键字。它将如何应用于多个对象实例?它与使用this基本相同吗?

2 个答案:

答案 0 :(得分:4)

在您的示例中,that是由此行创建的新对象:

var that = {};

然后该函数继续设置该对象的属性。

另一方面,this与构造函数一起使用 - 当使用new调用时,会自动创建一个新对象并将其作为this传递给函数。同样的例子可以写成:

myApp.Notepad = function(defaultFont) {
    this.writeable = true;
    this.font = defaultFont;
    this.setFont = function(theFont) {
        this.font = theFont;
    }
}

myApp.notepad1 = new myApp.Notepad('helvetica');

答案 1 :(得分:2)

使用尚未指出的对象文字构造函数(您的代码)的一个优点是,当您创建对象的新实例时,new关键字不是必需的。或者换句话说,如果您只是忘记使用new关键字,那么您的代码仍会按预期运行,因为您不再依赖new关键字的使用将this的范围赋予构造函数中新创建的对象; that对象现在正在为您处理范围。

这是YUI库(和Douglas Crockford)为构造函数所采用的方法。

考虑以下简单构造函数:

var Car = function(model){
  this.model = model;
};

如果您要致电Car('Dodge Viper');甚至var MyCar = Car('Dodge Viper');,则函数中的this实际上会引用全局window对象。所以现在上面的属性Model实际上是一个全局变量,这可能不是预期的。

var Car = function(model) {
  var that = {};
  that.model = model;
  return that;
};

// Both work the same.
var MamsCar = new Car("Mini Cooper"); // with 'new'
var DadsCar = Car("Bugatti Veyron"); // without 'new'
alert("Mam's car is a " + MamsCar.model + " and dad's car is a " + DadsCar.model);