为什么Function有隐式和显式原型引用,我可以设置隐式引用吗?

时间:2013-08-23 23:27:58

标签: javascript function prototype prototypal-inheritance

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

我对CF的两个原型参考以及这个陈述感到困惑:

  

CFp中名为CFP1的属性由cf1,cf2,cf3,cf4和   cf5(但不是CF)

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

1 个答案:

答案 0 :(得分:6)

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

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

那句话意味着您可以从CRP1访问cf1..cf5的内容,但不能从构造函数CF访问内容(请记住,函数/构造函数也是对象,因此它们可以有财产)。这是因为CFpCRP1的“所有者”)不是[[Prototype]]的{​​{1}},它只是CF属性指向的值。 CF.prototype属性仅存在于函数对象中,仅用于定义由函数调用创建的prototype实例作为构造函数调用(如[[Prototype]]中所示)。 new CF()[[Prototype]]读作“原型”的事实是混乱的根源 - 也许是令你困惑的一部分;希望它现在不那么混乱了。考虑到这一点,我会尽快回答你的其他问题。

  

许多关于Javascript的文献指出函数是第一类对象,因此我希望能够像对象一样设置隐式原型引用以实现原型继承[...]。

在ES5中,无法直接设置现有对象的隐式原型引用(或prototype),但非标准[[Prototype]]属性除外。您可以做的是使用给定的__proto__创建 new 对象。您可以使用[[Prototype]]var obj = new ConstructorFunction() [[Prototype]]objConstructorFunction.prototypevar obj = Object.create(someOtherObj) [[Prototype]]obj。该语言的更高版本引入了Object.setPrototypeOf来做到这一点,但出于性能原因,不鼓励使用它。

  

我可以在函数上设置这个隐式原型,还是总是指向Function.prototype(我假设这是默认值)。

是的,someOtherObj__proto__。但通常你不应该这样做。

  

为什么Function有显式和隐式原型?另外Javascript中的任何其他类型都有显式和隐式原型引用,或者在这方面功能是唯一的吗?

Object.setPrototypeOf(“Function构造函数”)只是一个函数,与任何其他函数一样,它具有Function属性;它也是一个对象,并且(几乎)任何其他对象都有一个prototype对象。其他类型也有标准构造函数,例如[[Prototype]]ObjectStringArrayBoolean。它们都是函数,并且同时包含Numberprototype