对于创建 Javascript 对象,我们可以使用 Literal 或 Constructor 方式;
在构造方法中,我们说;
function myObj(){
this.myProp1 = "abc";
this.myProp2 = "xyz";
}
按照字面意思,我们说;
var myObj = {
myProp1:"abc",
myProp2:"xyz",
}
我的问题是在声明属性时,为什么会有不同,比如为什么我们在构造函数方式中使用“this.myProp1”而不是在字面量方式中使用“this”?
两者之间的主要区别在于它们的使用方式。顾名思义,构造函数旨在创建和设置一个对象的多个实例。另一方面,对象文字是一次性的,如字符串和数字文字,更常用作配置对象或全局单例(例如,用于命名空间)。
第一个例子有一些微妙之处需要注意:
当代码被执行时,一个匿名函数被创建并分配给myObj
,但没有其他任何事情发生。 methodOne
和 methodTwo
在显式调用 myObj
之前不存在。
根据 myObj
的调用方式,方法 methodOne
和 methodTwo
将在不同的地方结束:
myObj()
:
由于未提供上下文,this
默认为 window
并且方法将变为全局。
var app1 = new myObj()
:
由于 new
关键字,一个新对象被创建并成为默认上下文。 this
引用新对象,方法将被分配给新对象,该对象随后被分配给 app1
。但是,myObj.methodOne
仍未定义。
myObj.call(yourApp)
:
这调用了我的 myObj
但将上下文设置为另一个对象 yourApp
。这些方法将被分配给 yourApp
,覆盖具有相同名称的 yourApp
的任何属性。这是一个非常灵活的方法,允许在 Javascript 中进行多重继承或混合。
构造函数还允许另一个级别的灵 active ,因为函数提供闭包,而对象字面量不提供。例如,如果 methodOne 和 methodTwo 依赖对象私有(private)的公共(public)变量密码(不能在构造函数外部访问),这可以非常简单地通过执行以下操作来实现:
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
暴露(公开)你会这样做:
var myObj = function(){
this.variableOne = "ABCD1234";
this.methodOne = function(){
// Do something with variableOne
console.log(this.variableOne);
};
this.methodTwo = function(){
// Do something else with variableOne
};
};
myObj();
alert(variableOne); // undefined
alert(myObj.variableOne); // ABCD1234