如果使用Object.getPrototypeOf()
函数,为什么实例的原型与其构造函数的原型不同?
function A(n){this.n=n;};
let a = new A(1);
console.log('Object.getPrototypeOf(a) == Object.getPrototypeOf(A); // ',
Object.getPrototypeOf(a) == Object.getPrototypeOf(A));
console.log('Object.getPrototypeOf(a) == A.prototype; // ',
Object.getPrototypeOf(a) == A.prototype);

答案 0 :(得分:2)
Object.getPrototypeOf()
返回内部[[Prototype]]
属性的值,该属性与prototype
属性不同。创建函数(或类)时,它会获得prototype
属性,当您创建它的实例时,创建的对象将内部[[Prototype]]
属性设置为prototype
该课程的财产。
您的第一个示例评估为false
,因为[[Prototype]]
a
为A.prototype
,[[Prototype]]
A
为Function.prototype
因为每个函数都是Function
类的实例。
答案 1 :(得分:1)
您看到了这一点,因为A
的原型(派生A
的原型对象)是Function.prototype
,而不是A.prototype
:
function A(n){this.n=n;};
console.log('Object.getPrototypeOf(A) === Function.prototype');
console.log(Object.getPrototypeOf(A) === Function.prototype);
let a = new A(1);
console.log('Object.getPrototypeOf(a) === A.prototype');
console.log(Object.getPrototypeOf(a) === A.prototype);

Object.getPrototypeOf(x)
不仅仅是一种令人费解的写作方式x.prototype
。
Object.getPrototypeOf(x)
返回x
派生的原型
x.prototype
是使用x
作为构造函数创建的对象的原型。
答案 2 :(得分:0)
虽然看起来很简单,但如果你知道原型继承在JS中是如何工作的,答案会变得更清楚。
我仍然会尝试简单地解释它,原型是如何工作的。
在JS中,一切都是对象。虽然数字,字符串,布尔值等原始值看起来不像对象,但在内部被视为对象。
现在让我们来看看有问题的案例。无论何时在JS中创建任何东西,它都会使用一些现有的原型。这取决于您正在创建的项目类型。
以下几行基本上是在后台做很多事情。它正在创建一个名为“A”的函数。这样做时,JS引擎在浏览器中使用一个名为Function.prototype的现有特殊对象。这包含您正在创建的任何函数的基本特征。然后它创建一个全新的对象,默认情况下只有两个属性:构造函数和默认对象原型的链接(由 proto 引用)。然后将您编写的新函数定义分配给这个新创建的函数。
function A(n){this.n=n;};
因此我们有两个原型可供理解:
Function.prototype将给出我们上面讨论的现有对象,该对象由引擎提供以创建新函数。
A.prototype是声明A时创建的新对象。请注意,我们尚未使用新函数A来创建对象。
在运行以下代码时,JS引擎创建一个新对象,该对象将继承A.prototype中的属性,运行存储在A(this.n = n etc ..)中的函数定义并返回新创建的对象。
let a = new A(1);
总结
我认为现在应该清楚以下代码的含义。
Object.getPrototypeOf(a) === A.prototype // true
Object.getPrototypeOf(A) === Function.prototype //true