繁体   English   中英

JavaScript继承的类构造函数问题

[英]Javascript inherited class constructor issue

我想使用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;

从子类中删除“ a”属性

问题是,该行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创建的对象的原型。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM