如果使用`Object.getPrototypeOf()函数,为什么实例的原型与其构造函数的原型不一样?

时间:2017-06-22 09:02:45

标签: javascript

如果使用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);




3 个答案:

答案 0 :(得分:2)

Object.getPrototypeOf()返回内部[[Prototype]]属性的值,该属性与prototype属性不同。创建函数(或类)时,它会获得prototype属性,当您创建它的实例时,创建的对象将内部[[Prototype]]属性设置为prototype该课程的财产。

您的第一个示例评估为false,因为[[Prototype]] aA.prototype[[Prototype]] AFunction.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中,一切都是对象。虽然数字,字符串,布尔值等原始值看起来不像对象,但在内部被视为对象。

如需快速参考,请参阅下文。一切都是对象。 enter image description here

现在让我们来看看有问题的案例。无论何时在JS中创建任何东西,它都会使用一些现有的原型。这取决于您正在创建的项目类型。

以下几行基本上是在后台做很多事情。它正在创建一个名为“A”的函数。这样做时,JS引擎在浏览器中使用一个名为Function.prototype的现有特殊对象。这包含您正在创建的任何函数的基本特征。然后它创建一个全新的对象,默认情况下只有两个属性:构造函数和默认对象原型的链接(由 proto 引用)。然后将您编写的新函数定义分配给这个新创建的函数。

function A(n){this.n=n;};

因此我们有两个原型可供理解:

  • Function.prototype的
  • A.prototype

Function.prototype将给出我们上面讨论的现有对象,该对象由引擎提供以创建新函数。

A.prototype是声明A时创建的新对象。请注意,我们尚未使用新函数A来创建对象。

在运行以下代码时,JS引擎创建一个新对象,该对象将继承A.prototype中的属性,运行存储在A(this.n = n etc ..)中的函数定义并返回新创建的对象。

let a = new A(1);

总结

  • a是继承自A.prototype
  • 的对象
  • A是一个继承自Function.prototype
  • 的函数(特殊对象)

我认为现在应该清楚以下代码的含义。

Object.getPrototypeOf(a) === A.prototype // true
Object.getPrototypeOf(A) === Function.prototype //true