gpt4 book ai didi

javascript - 为什么Function既有隐式原型(prototype)引用也有显式原型(prototype)引用,我可以设置隐式引用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:25:15 30 4
gpt4 key购买 nike

阅读本文档后: http://es5.github.io/#x4.2.1

我对 CF 上的两个原型(prototype)引用以及以下声明感到困惑:

The property named CFP1 in CFp is shared by cf1, cf2, cf3, cf4, and cf5 (but not by CF)

许多关于 Javascript 的文献都指出函数是一等对象,因此我希望能够像对象一样设置它们的隐式原型(prototype)引用以实现原型(prototype)继承(免责声明:我实际上并不知道我会用这个继承做什么,但我突然想到看看它是否可能)。我可以在一个函数上设置这个隐式原型(prototype),还是它总是指向 Function.prototype(我假设这是默认值)。为什么 Function 既有显式原型(prototype)又有隐式原型(prototype)?另外,Javascript 中的任何其他类型是否同时具有显式和隐式原型(prototype)引用,或者 Function 在这方面是独一无二的?

最佳答案

考虑规范中的图表及其下方的代码,它试图重现正在发生的事情:

enter image description here

function CF() {};            // the constructor
CF.P1 = 'foo'; // P1 is an own property of the constructor; P2 is the same
var CFp = { CRP1: 'bar' }; // for now, just an object, with a CRP1 property
CF.prototype = CFp // set CFp as the 'explicit prototype property' of CF;
// only constructors have such a property
var cf1 = new CF(); // an instance;
var cf2 = new CF(); // another instance; cf3..cf5 are constructed the same way
Object.getPrototypeOf(cf1); // CFp; this is the 'implicit prototype link' from cf1 to CFp;
// put another way, CFp became the [[Prototype]] of cf1

您说您对这句话感到困惑:CFp 中名为 CFP1 的属性由 cf1、cf2、cf3、cf4 和 cf5 共享(但不由 CF)。考虑一下:

cf1.CRP1;   // 'bar' - found on CFp through cf1
cf2.CRP1; // 'bar' - found on CFp through cf2
CF.CRP1; // undefined

那句话是什么意思,你可以从cf1..cf5访问CRP1的内容,但不能从构造函数CF访问(请记住,函数/构造函数也是对象,因此它们可以具有属性)。那是因为 CFp(CRP1 的“所有者”)不是 CF[[Prototype]] ,它只是 CF.prototype 属性指向的值。 prototype 属性仅存在于函数对象中,并且仅用于定义通过函数调用创建的实例的 [[Prototype]] 作为构造函数调用(如在 new CF() 中)。 [[Prototype]]prototype 都读作“prototype”这一事实是造成极大混淆的根源——也许是让您感到困惑的部分原因;希望现在不那么困惑了。考虑到这一点,我会尽快回答您的其他问题。

Much of the literature on Javascript points out that functions are first class objects, and as such I'd expect to be able to set their implicit prototype reference like an object to achieve prototypal inheritance [...].

在 ES5 中,除了非标准的 __proto__ 属性。您可以做的是使用给定的 [[Prototype]] 创建 对象。您可以使用 var obj = new ConstructorFunction() 来实现,其中 obj[[Prototype]]ConstructorFunction.prototype ,或者使用 var obj = Object.create(someOtherObj),其中 [[Prototype]]objsomeOtherObj。该语言的更高版本引入了Object.setPrototypeOf这样做,但出于性能原因,不鼓励使用它。

Can I set this implicit prototype on a function, or will it always point to Function.prototype (I'm assuming that's the default).

是的,使用 __proto__Object.setPrototypeOf。但通常你不应该这样做。

And why does Function have both explicit and implicit prototypes? Also do any other types in Javascript have both explicit and implicit prototype references or is Function unique in this regard?

Function(“Function 构造函数”)只是一个函数,与任何其他函数一样,它有一个 prototype 属性;它也是一个对象,并且(几乎)任何其他对象都有一个 [[Prototype]] 对象。其他类型也有标准构造函数,例如 ObjectStringArrayBooleanNumber 。它们都是函数,并且都有一个 prototype 和一个 [[Prototype]]

关于javascript - 为什么Function既有隐式原型(prototype)引用也有显式原型(prototype)引用,我可以设置隐式引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18413302/

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