【问题标题】:Javascript: Why is it Foo.prototype = Object.create(Bar.prototype) where Foo inherits from BarJavascript:为什么 Foo.prototype = Object.create(Bar.prototype) Foo 继承自 Bar
【发布时间】:2021-03-13 18:33:08
【问题描述】:

为什么

Foo.prototype = Object.create(Bar.prototype) 

为了让 Foo 从 Bar “继承” 而不是

Foo = Object.create(Bar)

至少

Foo.prototype = Object.create(Bar)

...因为Bar.prototype 不是已经是 Bar 反过来“继承”的“类”吗?说到原型链 (Why is it necessary to set the prototype constructor?)

但显然,Foo.prototype 的含义与 Foo.[[Prototype]] 完全不同。第一个表示在所有实例之间共享的东西

new Foo(args)

比如在

a = new Foo(args)
b = new Foo(args)

直观地说,thisFoo.prototype 似乎更像是“实例方法/属性”和“类级别方法/属性”之间的实例区别,而不是某种继承。

【问题讨论】:

  • Bar 是 Bar 的构造函数。如果你想把 Bar 的原型放到你的原型链上,你需要相应的 Foo.prototype = Object.create(Bar.prototype)Foo = Object.create(Bar) 没有意义,您将 Foo 设置为一个对象,该对象不是函数,不能调用,因此也不能构造。 Foo.prototype = Object.create(Bar) 将根据需要让instances-of-Foo 的原型链中包含Bar 的构造函数,而不是Bar 的原型。
  • 我认为最好在 Foo.prototype 中包含 Bar 的构造函数,而不是 Bar 的原型。我很难理解这一点。因为那时 - 这只是一个反问,因为你的答案显然是正确的 - 为什么还要费心去function Foo(); 无论如何,谢谢你的回答。
  • 构造函数,在 ES6 语法糖 class 甚至称为 constructor,用于创建实例,例如function Foo(x) { this.myInstanceValue = x; }。对于属性myInstanceValue,每个实例都有自己的值。原型是通用的,通常具有例如功能:Foo.prototype.printMe = function(){ console.log(this.myInstanceValue); }。请注意,在实例上也有一些功能有很多正当理由。现在,使用const a = new Foo('hello'), b = new Foo('world');a.printMe === b.printMe 并尝试使用a.printMe(); b.printMe();

标签: javascript prototype


【解决方案1】:

FooBar 都是函数。为了调用它们,构造函数必须是这样的,例如new Foo()。所以他们直接继承自Function.prototype

虽然是链接的,但构造函数与使用它们创建的实例的内部原型完全不同。构造函数的.prototype 属性访问实例的内部原型。这种原型的.constructor 属性访问构造函数。

这些内部原型是普通对象,而不是函数。您不会期望任何实例从 Function.prototype 继承并可以调用。

但很明显,Foo.prototype 的含义与 Foo.[[Prototype]]

完全不同

Foo构造函数的内部原型是Function.prototype

这是正确设置后的样子:

Object.prototype <- Function.prototype <- Foo
Object.prototype <- Function.prototype <- Bar

Object.prototype <- Bar.prototype <- bar instance
Object.prototype <- Bar.prototype <- Foo.prototype <- foo instance

构造函数不会相互继承——只有.prototypes,实例的内部原型(或[[Prototype]]s)在做这种事情时会相互继承。

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2017-06-23
    • 2020-10-03
    相关资源
    最近更新 更多