考虑规范中的图表,以及它下面的代码,它试图重现正在发生的事情:
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
那么这句话的意思是您可以访问CRP1
from的内容cf1..cf5
,但不能从构造函数访问CF
(请记住,函数/构造函数也是对象,因此它们可以具有属性)。那是因为CFp
( 的“所有者” CRP1
) 不是[[Prototype]]
of CF
,它只是属性指向的值CF.prototype
。该prototype
属性仅存在于函数对象中,并且仅用于定义[[Prototype]]
由函数调用创建的实例作为构造函数调用(如 in new CF()
)。事实上,两者[[Prototype]]
和prototype
读作“原型”是造成极大混乱的根源——也许是让你感到困惑的部分原因;希望它现在不那么混乱了。考虑到这一点,我将尝试简短地回答您的其他问题。
许多关于 Javascript 的文献都指出函数是第一类对象,因此我希望能够像对象一样设置它们的隐式原型引用以实现原型继承 [...]。
在 ES5 中,除了非标准属性外,没有办法直接设置现有对象的隐式原型引用(或)。您可以做的是使用给定的. 您可以使用, where the of或使用, where of the来做到这一点。该语言的较新版本引入了这样做,但出于性能原因不鼓励使用它。[[Prototype]]
__proto__
[[Prototype]]
var obj = new ConstructorFunction()
[[Prototype]]
obj
ConstructorFunction.prototype
var obj = Object.create(someOtherObj)
[[Prototype]]
obj
someOtherObj
Object.setPrototypeOf
我可以在函数上设置这个隐式原型,还是它总是指向 Function.prototype (我假设这是默认值)。
是的,使用__proto__
or Object.setPrototypeOf
。但通常你不应该这样做。
为什么 Function 既有显式原型又有隐式原型?Javascript 中的任何其他类型是否同时具有显式和隐式原型引用,或者 Function 在这方面是唯一的吗?
Function
(“Function
构造函数”)只是一个函数,并且与任何其他函数一样,它具有prototype
属性;它也是一个对象,并且(几乎)任何其他对象都有一个[[Prototype]]
对象。也有其他类型的标准构造函数,例如Object
, String
, Array
, Boolean
, Number
. 它们都是函数,并且同时具有 aprototype
和 a [[Prototype]]
。