我在这里读了一篇文章:
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
基本相同吗?
答案 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);