Javascript对象:Literal与构造函数

时间:2013-02-21 17:35:00

标签: javascript html oop prototype

为了创建Javascript对象,我们可以使用Literal或Constructor方式; 在Constructor方式中,我们说;

function myObj(){
this.myProp1 = "abc";
this.myProp2 = "xyz";
}

以字面的方式,我们说;

var myObj = {
myProp1:"abc",
myProp2:"xyz",
}

我的问题是在声明属性时,为什么会有这样的差异,比如为什么我们在构造方式的情况下使用“this.myProp1”并且不以Literal方式使用“this”?

2 个答案:

答案 0 :(得分:11)

两者之间的关键区别在于如何使用它们。顾名思义,构造函数旨在创建和设置对象的多个实例。另一方面,对象文字是一次性的,如字符串和数字文字,并且更常用作配置对象或全局单例(例如,用于命名空间)。

关于第一个要注意的例子,有一些细微之处:

执行代码时,会创建一个匿名函数并将其分配给myObj,但不会发生任何其他情况。在明确调用methodOne之前,methodTwomyObj不存在 根据{{​​1}}的调用方式,方法myObjmethodOne最终会出现在不同的地方:

methodTwo
由于没有提供上下文,myObj()默认为this,方法将变为全局。

window
由于var app1 = new myObj()关键字,会创建一个新对象并成为默认上下文。 new引用新对象,并将方法分配给新对象,随后将其分配给this。但是,app1仍未定义。

myObj.methodOne
这会调用我的myObj.call(yourApp),但会将上下文设置为另一个对象myObj。这些方法将分配给yourApp,覆盖yourApp具有相同名称的任何属性。这是一个非常灵活的方法,允许在Javascript中进行多重继承或混合。

构造函数还允许另一级别的灵活性,因为函数提供闭包,而对象文字则不然。例如,如果methodOne和methodTwo依赖于对象专用的公共变量密码(无法在构造函数外部访问),则可以通过以下操作非常简单地实现:

yourApp

如果您希望var myObj = function(){ var variableOne = "ABCD1234"; this.methodOne = function(){ // Do something with variableOne console.log(variableOne); }; this.methodTwo = function(){ // Do something else with variableOne }; }; myObj(); alert(variableOne); // undefined alert(myObj.variableOne); // undefined 公开(公开),您可以:

variableOne

答案 1 :(得分:4)

在按字面意思定义某些内容时,该对象直接在代码中构建。它在完成之前还不存在。那时,this没有任何意义(不是没有任何需要)。

要在对象创建函数中理解这一点,首先要意识到this在JavaScript中是特殊的。无论何时调用函数,都可以传递任何想要成为this的内容。通常,事件处理程序之类的东西会将导致事件的DOM对象传递为this。在您的代码中,您执行以下操作:MyFunction.call(whatever_needs_to_be_this[, param0, param1]);。当您使用新运算符(例如var mything = new SomeThing();)时,JavaScript基本上就是这样:

var mything = {};
SomeThing.call(mything);
在这种情况下,

this将在您的函数中为mything