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