gpt4 book ai didi

javascript - 有没有有效的方法在 javascript 中使用 `__proto__` 或 `setPrototypeOf()`?

转载 作者:可可西里 更新时间:2023-11-01 02:47:08 25 4
gpt4 key购买 nike

MDN 有一个关于修改代码原型(prototype)的巨大警告:

Changing the [[Prototype]] of an object is, by the nature of how modern JavaScript engines optimize property accesses, a very slow operation, in every browser and JavaScript engine. The effects on performance of altering inheritance are subtle and far-flung, and are not limited to simply the time spent in the Object.setPrototypeOf(...) statement, but may extend to any code that has access to any object whose [[Prototype]] has been altered. If you care about performance you should avoid setting the [[Prototype]] of an object. Instead, create a new object with the desired [[Prototype]] using Object.create().

MDN > JavaScript > Object.setPrototypeOf()

我想知道是否在某些情况下您可以修改对象的原型(prototype), 不会导致级联优化效果,从而降低程序的性能。好像应该有。例如,如果您仅在创建对象之后(并且在它被其他任何东西使用之前)修改原型(prototype)。但我认为这非常依赖于引擎。

那么有人知道是否有有效的方法来修改对象的原型(prototype)吗?

编辑:提出这个问题的动机是希望创建实际上继承自 Function 的对象。我知道如何做到这一点的唯一方法是修改函数的原型(prototype)。请在此处查看雷诺斯答案的最底部:javascript class inherit from Function class

最佳答案

The motivation for this question comes from a desire to create objects that actually inherit from Function.

看来您正在尝试执行以下操作:

  • 创建对象
  • 将这些对象的原型(prototype)(或__proto__ 属性)设置为引用Fuction.prototype这样它们就可以从 Function.prototype 继承属性,例如:
    • .apply
    • .call
    • .bind

您永远不需要更改任何对象的原型(prototype),只要您可以在创建对象时将其正确设置为所需的引用即可。


答案一:如何设置对象的原型(prototype)

您可以使用 Object.create() 在创建时设置任何对象的原型(prototype)。请注意,将任何对象的原型(prototype)分配给 Function.prototype不会使该对象成为可调用函数。但是,如果您仍想将原型(prototype)分配给 Function.prototype 或某个其他对象,您可以执行以下操作:

var obj1 = Object.create(Function.prototype);

这将:

  • 创建一个新对象,obj1
  • 设置其原型(prototype)(或 __proto__ 属性)以引用 Function.prototype 或您作为参数传入的任何对象
    • 即,它将通过 prototype chain 将失败的属性查找委托(delegate)给 Function.prototype (这就是 JavaScript 原型(prototype),__proto__ 指的是:委托(delegate)失败的属性查找的地方)

要求您使用Object.setPrototypeOf() 来更改现有对象的原型(prototype),因为它会在创建对象时分配原型(prototype)。请参阅 Object.create() 的 MDN 文档有关更多示例和信息——这不会带有与 setPrototypeOf() 相同的可怕警告。您可以使用 Object.create() 来设置任何新对象的原型(prototype)。


答案二:函数已经是对象

也就是说,如果您想要一个行为类似于函数的对象,您可以简单地创建一个函数。函数仍然是一个对象,但具有额外的函数特定属性和行为;您仍然可以通过为其分配属性来将其视为对象。如果您希望创建一个也像对象一样工作的函数,或者一个也可以做与函数相同的事情的对象,那么函数已经做到了。您可以执行以下操作:

var func = function() { return 'hello world'; }; // func is a function
func.property1 = 'foo'; // func is also an object
func.property2 = 'bar';

您问题的最佳解决方案可能是利用函数实际上已经是具有附加功能的对象这一事实。

关于javascript - 有没有有效的方法在 javascript 中使用 `__proto__` 或 `setPrototypeOf()`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480170/

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