2

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

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

从字面上看,我们说;

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

我的问题是在声明属性时,为什么会有区别,比如我们为什么在构造函数的情况下使用“this.myProp1”而不是在字面上使用“this”?

4

2 回答 2

12

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

第一个例子有一些微妙之处需要注意:

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

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   
于 2013-02-22T19:01:16.137 回答
4

当从字面上定义某些东西时,对象是直接在代码中构建的。在完成之前它还不存在。在那一点上,this将没有任何意义(也没有任何必要)。

要在对象创建函数中理解这一点,首先要意识到这this是 JavaScript 的特殊之处。每当你调用一个函数时,你可以传递任何你想成为的东西this。通常,事件处理程序之类的东西会将引发事件的 DOM 对象传递为this. 在您的代码中,您可以这样做:MyFunction.call(whatever_needs_to_be_this[, param0, param1]);. 当您使用 new 运算符时,例如var mything = new SomeThing();,JavaScript 本质上是在做类似的事情:

var mything = {};
SomeThing.call(mything);

this在这种情况下将mything在您的功能中。

于 2013-02-21T17:52:44.203 回答