JavaScript对象创建模式

JavaScript对象创建模式,javascript,constructor,design-patterns,object-literal,Javascript,Constructor,Design Patterns,Object Literal,我在这里读了一篇文章: 它讲述了创建对象的五种方法。但我的问题是他的方式之一(3)是: 根据作者的说法,我们可以在需要多个实例时使用它,我们可以使用3(以上)到5之间的任何模式 但据我所知,我们确实需要使用这个关键字,它反映了新创建的实例,并且只引用了那个实例。然而,在上面,作者使用了that对象而不是this,并且上面没有使用new关键字。它将如何应用于多个对象实例?它本质上与使用this相同吗?在您的示例中,是由此行创建的新对象: var that = {}; 然后,函数继续设置此对象的

我在这里读了一篇文章:

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

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


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

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

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');

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

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

考虑以下简单构造函数:

var Car = function(model){
  this.model = model;
};
如果你打电话给汽车(‘道奇毒蛇’)甚至
var MyCar=Car(“道奇毒蛇”)
,函数中的
实际上是指全局
窗口
对象。因此,上面的属性
Model
实际上是一个全局变量,这可能不是我们想要的

var Car=功能(型号){
var,它={};
模型=模型;
归还;
};
//两者工作原理相同。
var MamsCar=新车(“迷你库珀”);//“新的”
var DadsCar=汽车(“布加迪威龙”);//没有“新的”

警报(“妈妈的车是“+MamsCar.model+”,爸爸的车是“+DadsCar.model+”)谢谢,我知道,但是使用
那个
对象而不是使用
这个
构造函数方法有什么好处?@Dev555-这只是“构造”对象的一种不同(循环)方式。我不知道它是否有优势,但一个微妙之处是,
setFont
函数使用闭包,而不是引用
这个
对象
setFont
使用在其外部定义的
。从语法上讲,它对所做的事情不太清楚,因为它绕过了
new
操作符。@Seth:这就是混乱,等待事情澄清。感谢使用闭包引用实例有一些问题。它的内存效率不是很高,因为创建对象时必须保留作用域链,而不是进行垃圾收集。也意味着方法不能是泛型的,为此使用其他值调用它们将对原始对象(而不是传递给函数的this)进行操作。最后,这个名字没有给出任何关于它实际上是什么的暗示。我认为最好使用它来引用一个实例,并在比其他方法更有效的情况下保留闭包。
var Car = function(model){
  this.model = model;
};