以下两种在JavaScript中实现类继承的方法之间的区别是什么?
function Super () {
}
function Sub() {
}
Sub.prototype = new Super();
VS
Function.prototype.inherits = function inherits(ParentClass) {
function Surrogate () {};
Surrogate.prototype = ParentClass.prototype;
this.prototype = new Surrogate();
}
具体来说,对于使用代理功能的第二个例子,我们为什么不能使用:
Function.prototype.inherits = function inherits(ParentClass) {
this.prototype = new ParentClass();
}
我认为通过调用new
上的ParentClass()
并将其设置为this.prototype
,this.prototype
然后指向ParentClass.prototype
,因此从后者继承
答案 0 :(得分:2)
具体来说,对于使用代理功能的第二个例子,我们为什么不能使用[...]
Surrogate
方式基本上是Object.create
的垫片,现代做法是
Sub.prototype = Object.create(Super.prototype);
如果您需要在您的实例上调用 Super 的构造函数,
function Sub() {
// an instanceof check here
Super.apply(this);
// construct Sub as desired
}
没有 Super 实例作为 Sub 原型的优势在于我们可以更好地控制 Sub 和don& #39;由于意外的共享值而导致奇怪的错误,
考虑以下
function Foo() {
this.bar = [];
}
function Fizz() {}
Fizz.prototype = new Foo();
var a = new Fizz(),
b = new Fizz();
a.bar.push('Hello world!');
// What is b.bar?
b.bar; // ["Hello world!"], we are sharing with `a`
VS
function Foo() {
this.bar = [];
}
function Fizz() {
Foo.apply(this);
}
Fizz.prototype = Object.create(Foo.prototype);
var a = new Fizz(),
b = new Fizz();
a.bar.push('Hello world!');
// What is b.bar?
b.bar; // [], `b` has some privacy at last