每个函数对象都有__proto__
其内部属性。他们也prototype
有财产。因为prototype
它也是一个对象,所以它也有一个__proto__
属性。我的问题是,__proto__
原型内部和函数对象中的属性是否都指向Function.prototype
?
4 回答
不,函数的原型属性(即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
,没有其他对象。
函数的属性命名prototype
是一个普通对象,它成为使用该函数作为构造函数时创建的对象的原型。
函数的实际原型(可通过 访问__proto__
)是一个名为 的对象Function.prototype
,它按顺序从Object.prototype
.
不。
hidden__proto__
属性实际上不应该被 JS 程序员直接使用,它是作为将对象绑定到其原型链的粘合剂。
像这样:
function x () {}
x.__proto__; // is a prototypical function, leading back to `Function.prototype`
但是,prototype
它只是一个对象,它在函数内部被分配给__proto__
您正在创建的任何内容的属性new
。
由于它只是一个常规对象,__proto__
最终会导致返回Object.prototype
.
使用运算符时,该__proto__
属性指向函数。constructor
new
如果您的构造函数是 instanceof Function
,则对象中的所有属性和方法Function.proptotype
都可以被实例访问,并且将使用与上下文相同的内容。
有些浏览器没有实现对__proto__
对象的访问,所以如果你不想使用,就会失去兼容性。
MDN 文档中的更多信息:https ://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/Object/proto