我怎样才能使用backbone.js的多态性,尤其是超级属性?

时间:2015-11-23 02:27:47

标签: javascript inheritance backbone.js polymorphism

我正在尝试制作超类(MyShape)和子类(MyTriangle,MyRectangle)。我已经搜索了一些backbone.js的多态概念......但是对这个问题一无所知。

我有一个.json文件,如下所示

[
{
    "type": "rect",
    "x": 10,
    "y": 10,
    "w": 100,
    "h": 100,
    "color": "red"
},
{
    "type": "arc",
    "x": 210,
    "y": 20,
    "w": 200,
    "h": 150,
    "color": "blue"
}
]

我使用backbone.js制作了继承结构,如下所示。

    var MyShape = Backbone.Model.extend({
        defaults : {
            color : '',
            src : '',
        }
    });

    var MyRectangle = MyShape.extend({
        defaults : {
            x : 0,
            y : 0
        }
    });

    var MyTriangle = MyShape.extend({
        defaults : {
            x : -10,
            y : -10
        }
    });

    var Collection = Backbone.Collection.extend({
        model : MyShape,
    });

如上所示,超类(MyShape)具有color和src属性。因此,我遇到了一个问题。如果我创建了MyTriangle实例,我想我不能在该对象上使用src或color属性。

问:如果我想制作如下代码(这个例子是基于Java的),我应该如何编码呢?​​

    MyShape myShape = null;
    if (type.equals("rect")) {
        myShape = new MyRectangle(x, y, w, h);
    } else if (type.equals("arc")) {
        myShape = new MyArc(x, y, w, h);
    } else if (type.equals("triangle")) {
        myShape = new MyTriangle(x, y, w, h);
    } else {
        return null;
    }


    // option - src or color
    if (jsonObject.has("src")) {
        myShape.setImg(jsonObject.get("src").toString());
    } else if (jsonObject.has("color")) {
        myShape.setColor(jsonObject.get("color").toString);
    } else {
        return null;
    }

我必须维护这个结构(MyShape,MyTriangle,MyRectangle)。

我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

要使用父类的default,您需要扩展父类的默认值。

所以,例如(source

var MyRectangle = defaults : _.extend({}, MyShape.prototype.defaults, {
        x : 0,
        y : 0
     })
});

在主干集合中使用多态模型(sourcesimilar question

  

通过使用返回模型的构造函数覆盖此属性,集合还可以包含多态模型。

var Library = Backbone.Collection.extend({

   model: function(attrs, options) {
     if (condition) {
      return new PublicDocument(attrs, options);
    } else {
    return new PrivateDocument(attrs, options);
    }
  }
});

example放在一起