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

Jam*_*add 4 javascript prototype function prototypal-inheritance

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

我对CF上的两个原型引用感到困惑,并且通过以下声明:

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

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

bfa*_*tto 6

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

在此输入图像描述

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
Run Code Online (Sandbox Code Playgroud)

你说你对这句话很困惑: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
Run Code Online (Sandbox Code Playgroud)

那么这句话意味着你可以访问CRP1from 的内容cf1..cf5,而不是构造CF函数的内容(记住,函数/构造函数也是对象,因此它们可以具有属性).那是因为CFp(的"所有者" CRP1)不是[[Prototype]]CF,它只是被指向的价值CF.prototype属性.该prototype属性仅存在于函数对象中,仅用于定义[[Prototype]]由调用函数调用创建的实例作为构造函数(如in new CF()).这两个事实[[Prototype]],并prototype解读为"原型"是极大的混乱之源-什么是混淆了你的,也许一部分; 希望它现在不那么混乱了.考虑到这一点,我会尽快回答你的其他问题.

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

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

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

是的,有__proto__Object.setPrototypeOf.但通常你不应该.

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

Function(" Function构造函数")只是一个函数,和任何其他函数一样,它有一个prototype属性; 它也是一个对象,并且(几乎)任何其他对象都有一个[[Prototype]]对象.还有其他类型的标准构造太像Object,String,Array,Boolean,Number.它们都是功能,并且具有a prototype和a [[Prototype]].