为了创建Javascript对象,我们可以使用Literal或Constructor方式; 在Constructor方式中,我们说;
function myObj(){
this.myProp1 = "abc";
this.myProp2 = "xyz";
}
以字面的方式,我们说;
var myObj = {
myProp1:"abc",
myProp2:"xyz",
}
我的问题是在声明属性时,为什么会有这样的差异,比如为什么我们在构造方式的情况下使用“this.myProp1”并且不以Literal方式使用“this”?
答案 0 :(得分:11)
两者之间的关键区别在于如何使用它们。顾名思义,构造函数旨在创建和设置对象的多个实例。另一方面,对象文字是一次性的,如字符串和数字文字,并且更常用作配置对象或全局单例(例如,用于命名空间)。
关于第一个要注意的例子,有一些细微之处:
执行代码时,会创建一个匿名函数并将其分配给myObj
,但不会发生任何其他情况。在明确调用methodOne
之前,methodTwo
和myObj
不存在
根据{{1}}的调用方式,方法myObj
和methodOne
最终会出现在不同的地方:
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
。