两者之间的主要区别在于它们的使用方式。顾名思义,构造函数旨在创建和设置对象的多个实例。另一方面,对象文字是一次性的,就像字符串和数字文字一样,并且更常用作配置对象或全局单例(例如,用于命名空间)。
第一个例子有一些微妙之处需要注意:
执行代码时,会创建一个匿名函数并将其分配给myObj
,但不会发生其他任何事情。methodOne
并且在被明确调用methodTwo
之前不存在。
根据调用方式,方法和最终会出现在不同的地方:myObj
myObj
methodOne
methodTwo
myObj()
:
由于没有提供上下文,this
默认值window
和方法将变为全局。
var app1 = new myObj()
:
由于new
关键字,一个新对象被创建并成为默认上下文。this
引用新对象,方法将被分配给新对象,新对象随后被分配给app1
. 但是,myObj.methodOne
仍然未定义。
myObj.call(yourApp)
:
这调用 mymyObj
但将上下文设置为另一个对象,yourApp
. 这些方法将被分配给yourApp
,覆盖yourApp
具有相同名称的任何属性。这是一种非常灵活的方法,它允许在 Javascript 中进行多重继承或混合。
构造函数还允许另一个级别的灵活性,因为函数提供闭包,而对象文字不提供。例如,如果 methodOne 和 methodTwo 依赖于对象私有的公共变量密码(不能在构造函数之外访问),则可以通过执行以下操作非常简单地实现:
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