首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么函数同时具有隐式和显式的原型引用,我可以设置隐式引用吗?

为什么函数同时具有隐式和显式的原型引用,我可以设置隐式引用吗?
EN

Stack Overflow用户
提问于 2013-08-23 23:27:57
回答 1查看 1.8K关注 0票数 6

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-24 00:15:26

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

代码语言:javascript
复制
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中的名为CFp的属性由cf1、cf2、cf3、cf4和cf5共享(但不由CF共享)。考虑到这一点:

代码语言:javascript
复制
cf1.CRP1;   // 'bar' - found on CFp through cf1
cf2.CRP1;   // 'bar' - found on CFp through cf2
CF.CRP1;    // undefined

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

关于Javascript的许多文献指出,函数是一流的对象,因此我希望能够像对象一样设置它们的隐式原型引用来实现原型继承.

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

我可以在函数上设置这个隐式原型吗?或者它总是指向Function.prototype (我假设这是默认的)。

是的,包括__proto__Object.setPrototypeOf。但通常你不应该。

为什么函数同时具有显式原型和隐式原型?另外,Javascript中是否有任何其他类型的显式和隐式原型引用,或者在这方面函数是唯一的?

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18413302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档