功能对象属性

时间:2013-01-27 18:10:24

标签: javascript

每个函数对象都有__proto__作为其内部属性。他们也有prototype财产。由于prototype也是一个对象,因此它也具有__proto__属性。我的问题是,原型和函数对象中的__proto__属性是否都指向Function.prototype

4 个答案:

答案 0 :(得分:1)

没有。函数的原型属性(即SomeFunc.prototype)是普通对象,因此其内部__proto__属性指向Object.prototype

测试它的简单方法:

function Foo() {};
console.log(Object.getPrototypeOf(Foo) === Object.getPrototypeOf(Foo.prototype));
// logs false
console.log(Object.getPrototypeOf(Foo) === Function.prototype);
// logs true
console.log(Object.getPrototypeOf(Foo.prototype) === Object.prototype);
// logs true

只有函数继承自Function.prototype,没有其他对象。

答案 1 :(得分:1)

名为prototype的函数属性是一个普通对象,它成为使用该函数作为构造函数时创建的对象的原型。

函数的实际原型(可通过__proto__访问)是一个名为Function.prototype的对象,它按顺序从Object.prototype下降。

Diagram

答案 2 :(得分:0)

没有

隐藏的__proto__属性,不应该被JS程序员直接使用,而是将对象绑定到其原型链的粘合剂。

因此:

function x () {}

x.__proto__; // is a prototypical function, leading back to `Function.prototype`

但是,prototype只是一个对象,它被分配给函数内部__proto__创建的new属性。

因为它只是一个常规对象,__proto__最终将返回Object.prototype

答案 3 :(得分:0)

当您使用__proto__运算符时,constructor属性指向函数中的new

如果您的构造函数是Function的实例,则Function.proptotype对象中的所有属性和方法都可以被实例访问,并且将使用相同的上下文。

某些浏览器无法实现对__proto__对象的访问,因此如果您不想使用,则会失去兼容性。

MDN文档中的更多信息:https://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/Object/proto