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