本地参考这个?

时间:2015-02-12 16:45:45

标签: javascript this

为什么'这个'需要本地参考?第一个代码段工作正常,但第二个代码段产生错误...您正在创建引用(不是通过值传递),因此您将修改相同的对象原型,这是您正在尝试的无论如何......不确定错误来自哪里......

代码差异是每个细分的前几行

第一段代码:

Function.prototype.construct = function(aArgs) {
  var a = this;  
  var fNewConstr = function() { a.apply(this, aArgs); };
  fNewConstr.prototype = a.prototype;
  return new fNewConstr();
};

function MyConstructor() {
  for (var nProp = 0; nProp < arguments.length; nProp++) {
    this['property' + nProp] = arguments[nProp];
  }
}

var myArray = [4, 'Hello world!', false];
var myInstance = MyConstructor.construct(myArray);

第二段代码:

Function.prototype.construct = function(aArgs) {  
  var fNewConstr = function() { this.apply(this, aArgs); };
  fNewConstr.prototype = this.prototype;
  return new fNewConstr();
};

function MyConstructor() {
  for (var nProp = 0; nProp < arguments.length; nProp++) {
    this['property' + nProp] = arguments[nProp];
  }
}

var myArray = [4, 'Hello world!', false];
var myInstance = MyConstructor.construct(myArray);

1 个答案:

答案 0 :(得分:0)

在代码的第一位,你的“构造”方法,this的值将是你调用它的函数。 函数打算从其内部构造函数返回的新构造的对象。

为每个函数调用设置this的值,具体取决于调用的性质。您通过new调用“fNewConstr”,因此该函数中this的值是正在构造的对象。为了将原始“根”函数正确应用于新创建的对象,它需要对该函数的引用。这就是“a”中保存的内容。

当您致电

时,一步一步
MyConstructor.construct(myArray);

会发生什么:

  1. 检查符号“MyConstructor”,发现它是对象的引用 - 实际上是一个函数。
  2. .运算符导致查找属性“construct”,首先在“MyConstructor”函数对象本身上查找,然后在对象的原型上查找属性名称。
  3. “construct”属性的值是一个函数,因此( )运算符启动函数调用。
  4. 现在我们在“construct”中,this是对“MyConstructor”函数的引用。该引用立即被复制到“a”。
  5. 初始化“fNewConstr”变量,然后立即通过new调用。创建一个新对象,现在启动 函数调用,this引用该新对象。
  6. 在“fNewConstr”中,“a”仍然引用“MyConstructor”,因此该引用允许运行时在Function原型上找到“apply”函数。现在启动功能,我们最终会以“MyConstructor”代码结束。
  7. 在“MyConstructor”中,this将引用使用new操作构造的对象,参数将是最初传入的数组的元素。