理解链构造函数中的Function.prototype.apply方法

时间:2015-04-19 15:29:32

标签: javascript

我不知道如何提出这个问题。我认为使用示例会更好理解:(this我从MDN获取的例子)

Function.prototype.construct = function (aArgs) {
  var oNew = Object.create(this.prototype);
  this.apply(oNew, aArgs);
  return oNew;
};
function MyConstructor() {
  for (var nProp = 0; nProp < arguments.length; nProp++) {
    this['property' + nProp] = arguments[nProp];
  }
}

var myArray = [4, 'Hello world!', false];

我可以用两种方式创建对象:

  1. var obj1=new MyConstructor(4,'Hello world!', false);
  2. var myInstance = MyConstructor.construct(myArray);
  3. 使用这两种方式创建对象有什么区别?为什么我们使用apply方法在链构造函数中创建对象以及使用第二种方式创建对象的优点是什么?

1 个答案:

答案 0 :(得分:5)

  

使用这两种方式创建对象有什么区别?

从根本上说,区别在于您是将参数作为离散参数(#1)还是作为数组(#2)。另外,第一种方式是标准的普通JavaScript;第二个要求你扩展Function原型。

  

为什么我们使用apply方法在链构造函数中创建对象

这样就可以将参数传递给构造函数,就好像它们是作为离散参数提供的一样。

这是相当复杂的代码,因此Function#apply所做的更简单的示例可能很有用。让我们采取一种无聊的功能:

function foo(a, b, c) {
    console.log(a);
    console.log(b);
    console.log(c);
}

现在,让我们用离散的参数调用它:

foo(1, 2, 3);

......这给了我们

1
2
3

现在,让我们使用apply(暂时忽略null):

var a = [1, 2, 3];
foo.apply(null, a);

我们得到了相同的结果:

1
2
3

Function#apply接受用作this作为第一个参数的值,以及在第二个参数中作为数组(或类数组对象)调用的参数,并调用函数this值和参数。

  

使用第二种方式创建对象有什么好处?

只是你可以使用数组作为参数,而不是单独列出它们。