JavaScript中的伪古典与代理函数继承

时间:2015-07-07 02:55:35

标签: javascript

以下两种在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.prototypethis.prototype然后指向ParentClass.prototype,因此从后者继承

1 个答案:

答案 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