gpt4 book ai didi

javascript - MDN Function.prototype.apply() 的一个例子

转载 作者:行者123 更新时间:2023-11-30 14:59:37 34 4
gpt4 key购买 nike

以下例子引用自MDN:

Function.prototype.construct = function(aArgs) {
console.warn('Function construct')
var oNew = Object.create(this.prototype);
this.apply(oNew, aArgs);
return oNew;
};

function MyConstructor() {
console.warn('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 construct  
MyConstructor

为什么 this.apply(oNew, aArgs); 调用了 MyConstructor ()

感谢解答

最佳答案

Why the this.apply(oNew, aArgs); called MyConstructor ()?

让我们一步步来:

  • 当解释器到达 MyConstructor.construct(myArray); 时,它会尝试在对象 MyConstructor 上找到属性 construct。口译员找不到它。然后它通过其原型(prototype)链(内部 [[Prototype]] 属性)一步,即对象 Function.prototype。它确实有它!查找过程停止并开始解释 construct 函数。这种查找属性的方式称为 prototype inheritance .

  • 在这种情况下(并非总是如此),construct 函数中的 this 指的是 MyConstructor 对象(记住所有函数都是对象)。所以 this.prototype 是对象 Function.prototype

  • Object.create()获取一个对象并使用给定对象创建一个新对象作为其直接父原型(prototype)对象。所以 oNew 是一个与 this 具有相同原型(prototype)的普通对象。

  • this.apply(oNew, aArgs); 这里记忆一下,this MyConstructor。因此,此语句调用 MyConstructor 函数并将 oNew 作为其 this 并将 aArgs 作为其参数传递。

  • MyConstructor 被调用时,它的 this 引用 oNew 并且它的 arguments 是一个数组,包含aArgs.


第二个例子:

什么是[].push.apply(args, arguments);?我们走吧:)

  • [] 创建一个空数组文字(它也是一个对象)。
  • 由于 [] 本身没有任何属性,[].push 指的是 push 对象(记住函数是对象)通过其原型(prototype)链在其父级上。
  • [].push.apply 调用该函数并将 args 作为其 this 并将 arguments 作为其传递论点。

您可以使用 Array.prototype.push.apply() 而不是 [].push.apply()。这些 push 对象引用同一个对象。

关于javascript - MDN Function.prototype.apply() 的一个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46742196/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com