Javascript - 在同一个JSON字符串中打包父级和子级的属性

时间:2014-05-22 12:33:33

标签: javascript class inheritance

我有一个javascript场景,我已经创建了一个基类和派生类,并希望使用JSON.stringify()将整个属性集打包到一个JSON字符串中。

当我使用等价于下面的代码时,我只在运行" toString()"时才获得子对象的属性。在其中一个DerivedClass实例上:

function BaseClass() {
    this.version = "0.0.0";
    this.time = Date.now();
    this.type = this.constructor.name;
}

BaseClass.prototype.BaseClassException = function(message) {
    this.message = message;
}

BaseClass.prototype.toString = function() {
    return JSON.stringify(this);
}

BaseClass.parse = function(jsonString) {
    var json = JSON.parse(jsonString);

    switch(json.type) {
    case "DerivedClass1":
        return new DerivedClass1();
    case "DerivedClass2":
        return new DerivedClass2();
    default:
        throw new BaseClassException("No compatible type found when parsing: " + jsonString);
}

function DerivedClass1(prop1, prop2) {
    this.prop1 = prop1;
    this.prop2 = prop2;
    this.type = this.constructor.name;
}
DerivedClass1.prototype = new BaseClass();
DerivedClass1.prototype.constructor = DerivedClass1;

function DerivedClass2(prop3) {
    this.prop3 = prop3;
}
DerivedClass2.prototype = new BaseClass();
DerivedClass2.prototype.constructor = DerivedClass2;


// Test
var dc1 = new DerivedClass1("A", "B");
console.log(dc1.toString());  // Returns JSON-string with properties of DerivedClass1, but not BaseClass

会有几个不同的派生类。虽然我知道js并不真正支持类我仍然希望将基础和子对象中的所有属性打包在同一个JSON字符串中。结构必须与整个系统的其他节点,即所有属性都需要存在。

如果有人同时知道在正确的方向上推动我理解子对象和父对象之间的联系,以便我更好地理解"继承" js的一部分我也非常感激。我更习惯严格的oo语言,所以我很乐意学习。

1 个答案:

答案 0 :(得分:2)

我可以随手提出两件事。

  1. 要调用基类构造函数,必须像这样

    手动调用它
    function DerivedClass1(prop1, prop2) {
        BaseClass.call(this);
        this.prop1 = prop1;
        this.prop2 = prop2;
        this.type = this.constructor.name;
    }
    

    我们使用当前对象调用父构造函数。这里要注意的重要一点是,我们将当前上下文设置为DerivedClass1类型的对象。

  2. 要实际进行原型继承,您需要使用基类的原型,而不是对象。

    DerivedClass1.prototype = Object.create(BaseClass.prototype);
    

    在您的情况下,BaseClass的构造函数不依赖于任何参数。因此,做DerivedClass1.prototype = new BaseClass();不会产生很大的影响。但是最好只依赖于Parent构造函数的原型。在此wonderful answer中了解有关使用Object.create进行继承的详情。