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

Javascript 如果要使用`Object.getPrototypeOf()`函数,为什么实例的原型与其构造函数的原型不同?,javascript,Javascript,如果要使用Object.getPrototypeOf()函数,为什么实例的原型与其构造函数的原型不同 函数A(n){this.n=n;}; 设a=新的a(1); console.log('Object.getPrototypeOf(a)==Object.getPrototypeOf(a);/', Object.getPrototypeOf(a)==Object.getPrototypeOf(a)); console.log('Object.getPrototypeOf(a)==a.protot

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

函数A(n){this.n=n;};
设a=新的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)
对象。getPrototypeOf()
返回内部
[[Prototype]]
属性的值,该属性与
Prototype
属性不同。创建函数(或类)时,它会获得一个
prototype
属性,创建它的实例时,所创建的对象将内部
[[prototype]]
属性设置为类的
prototype
属性


您的第一个示例的计算结果为
false
,因为
a的
[[Prototype]]
a.Prototype
,但是
a的
[[Prototype]]
函数。Prototype
,因为每个函数都是
函数
类的实例。

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


第一个示例的计算结果为
false
,因为
a的
[[Prototype]]
a.Prototype
,而
a的
[[Prototype]]
函数。Prototype
,因为每个函数都是
函数
类的一个实例。

您看到这一点是因为
A
的原型(从中派生
A
的原型对象)是
函数。原型
,而不是
A.prototype

函数A(n){this.n=n;};
log('Object.getPrototypeOf(A)==Function.prototype');
console.log(Object.getPrototypeOf(A)==Function.prototype);
设a=新的a(1);
log('Object.getPrototypeOf(a)==a.prototype');

console.log(Object.getPrototypeOf(a)==a.prototype)
您之所以看到这一点,是因为
A
的原型(从中派生
A
的原型对象)是
函数。prototype
,而不是
A.prototype

函数A(n){this.n=n;};
log('Object.getPrototypeOf(A)==Function.prototype');
console.log(Object.getPrototypeOf(A)==Function.prototype);
设a=新的a(1);
log('Object.getPrototypeOf(a)==a.prototype');

console.log(Object.getPrototypeOf(a)==a.prototype)虽然乍一看似乎很简单,但如果您知道protoypal继承在JS中是如何工作的,那么答案将变得更加清楚

尽管如此,我还是试图简单地解释一下,原型是如何工作的

在JS中,一切都是一个对象。尽管原始值(如数字、字符串、布尔值)看起来不像对象,但在内部被视为对象

有关快速参考,请参见下文。一切都是对象。

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

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

function A(n){this.n=n;};
因此,我们有两个原型需要理解:

  • 功能原型
  • A.原型
prototype将提供我们上面讨论的现有对象,该对象由引擎提供以创建新函数

prototype是在声明时创建的新对象。请注意,我们还没有使用新函数A来创建对象

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

let a = new A(1);
概括

  • a是从a.prototype继承的对象
  • A是从function.prototype继承的函数(特殊对象)
我想现在应该清楚下面的代码是什么意思了

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

虽然乍一看似乎很简单,但如果您知道protoypal继承在JS中是如何工作的,那么答案将变得更加清楚

尽管如此,我还是试图简单地解释一下,原型是如何工作的

在JS中,一切都是一个对象。尽管原始值(如数字、字符串、布尔值)看起来不像对象,但在内部被视为对象

有关快速参考,请参见下文。一切都是对象。

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

下面这行基本上是在后台做很多事情。它正在创建一个名为“a”的函数。在执行此操作时,JS引擎使用浏览器中已存在的名为Function.prototype的特殊对象。它包含您正在创建的任何函数的基本特征。然后它创建一个全新的对象,该对象只有t