【发布时间】: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)
直观地说,this 和 Foo.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