Javascript继承了类构造函数问题

时间:2016-10-16 09:52:04

标签: javascript inheritance constructor prototype

我想在javascript中使用原型从超类创建一个子类,所以我设置它们:

var SuperClass = function() {
    this.a = 1;
    this.get = function() {return this.a;}
    this.init = function() {
        CreateStrangeThings();
    }
    this.init();
}
var SubClass = function() {
    this.b = 2;
    this.get = function() {return this.b;}
}
SubClass.prototype = new SuperClass();

问题是,行SubClass.prototype = new SuperClass();调用CreateStrangeThings();函数。我希望只有在创建子类对象(var subOjbect = new SubClass();

时才能调用此函数

如何克服这个问题?也许我应该使用SubClass.prototype = SuperClass;?是明智的吗?

修改

SubClass.prototype = SuperClass;

从SubClass中删除“a”属性

1 个答案:

答案 0 :(得分:2)

  

问题是,行SubClass.prototype = new SuperClass();调用CreateStrangeThings();函数。

是。这就是为什么这种模式尽管经常被引用,但却是错误的。另一个原因是它忽略了超类构造函数可能需要参数的可能性。

相反,在不调用超级构造函数的情况下创建原型对象:

SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

...并且还调用SubClass中的超级构造函数:

var SubClass = function() {
    SuperClass.call(this);
    this.b = 2;
    this.get = function() {return this.b;}
};

所以我们一起得到:

var SuperClass = function() {
    this.a = 1;
    this.get = function() {return this.a;}
    this.init = function() {
        CreateStrangeThings();
    }
    this.init();
};
var SubClass = function() {
    SuperClass.call(this);
    this.b = 2;
    this.get = function() {return this.b;}
};
SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

当然,使用ES2015和一个转发器。

class SuperClass {
    constructor() {
        this.a = 1;
        this.get = function() {return this.a;};
        this.init = function() {
            CreateStrangeThings();
        };
        this.init();
    }
}
class SubClass {
    constructor() {
        super();
        this.b = 2;
        this.get = function() {return this.b;};
    }
}
  

如何克服这个问题?也许我应该使用SubClass.prototype = SuperClass;?是明智的吗?

没有。如果您希望通过new SubClass创建的对象继承SuperClass.prototype的属性,则需要SubClass.prototype使用SuperClass.prototype作为其原型。 SuperClass没有; SuperClass的原型是Function.prototype,而不是SubClass.prototype。 (忽略函数上prototype属性的名称;它不是原型,原型new分配给通过new TheFunction创建的对象。)