gpt4 book ai didi

JavaScript 动态对象

转载 作者:行者123 更新时间:2023-11-27 22:57:24 25 4
gpt4 key购买 nike

我创建了一个包含 1000 辆汽车的数组。当我在第一辆车上调用 run 时,我希望它正常运行。当我在任何其他车辆和将来创建的任何汽车上调用 run 时,我希望它正常运行,但也记录 {color} 汽车现在正在运行。到控制台。

解决方案:

`cars[0].run = cars[0].run;

var oldRun = Car.prototype.run;
Car.prototype.run = function () {
console.log("The " + this.color + " car is now running");
return oldRun.apply(this, arguments);
};

有人能解释一下这个函数是如何工作的吗?它来自javacript面试问题列表。

最佳答案

让我们一次剖析这一行:

cars[0].run = cars[0].run;

我假设 run 方法最初是一个原型(prototype)函数。通过将 cars run 方法分配给它自己的 run 方法名称,我们本质上只是返回一个常规函数,而不是 Car 对象的原型(prototype)函数。这意味着它不会受到对原型(prototype)函数所做的任何更改的影响,原型(prototype)函数稍后会获得新的定义。

var oldRun = Car.prototype.run;

与上面相同,只是我们将其存储在自己的函数名称中,而不是分配给特定的汽车。现在可以在全局范围内使用。

Car.prototype.run = function () {

现在我们正在为所有汽车重新定义名为 run 的原型(prototype)方法。第一辆车不受此影响,因为它的 run 方法现在只是一个普通函数,只属于该车。

console.log("The " + this.color + " car is now running");

非常简单。

return oldRun.apply(this, arguments);

由于我们将原始 run 方法调用存储到 oldRun 中,因此我们现在可以调用它并返回该函数返回的任何内容。我们不只是像 oldRun(); 这样调用它,而是使用 apply 方法调用,这样我们就可以传入一个“this”引用,该引用指的是我们从中调用它的汽车。以下是 MDN 的链接,了解有关“应用”的更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

那么为什么我们必须传递“this”。这是因为 oldRun 函数不属于任何对象,并且与其完全分离。新的“run”原型(prototype)方法确实有对汽车的引用,并且已经使用了“this”,因此我们只需将该引用传递给新函数 oldRun。这样,如果 oldRun 使用关键字“this”,它就会知道它现在指的是什么。

arguments 是一个对象,引用通过函数原型(prototype) run 传递的参数。所有函数都可以访问它。因此,如果您运行 cars[1].run(param1, param2),两个参数都会传递给 oldRun 函数。

我写这篇文章的时候有点匆忙,所以如果我错过了什么或者没有解释清楚什么,请在评论中告诉我。

关于JavaScript 动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37468232/

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