每个函数对象都有__proto__
作为其内部属性。他们也有prototype
财产。由于prototype
也是一个对象,因此它也具有__proto__
属性。我的问题是,原型和函数对象中的__proto__
属性是否都指向Function.prototype
?
答案 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
下降。
答案 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