如何在事后改变对象实例的类型

时间:2014-11-17 17:02:02

标签: javascript oop object

我想知道如何将给定类型的预先存在的对象实例(例如,键入' Widget')转换/扩展为新类型(例如,' WidgetPlus' ),以便实例继承原始和新的所有方法和变量。

所以,如果我有 widget_1 widget_2 widget_3 ,所有这些都被实例化为新Widget(),将这些实例扩展到我的新 WidgetPlus 类的最佳方法是什么?

提前致谢,

安迪

1 个答案:

答案 0 :(得分:0)

这取决于你想要实现的目标。

var Widget = function(){
    this.name = 'Widget';
    this.a = 'a';
};
Widget.prototype.foo = function(){ return 'foo'; };

var WidgetPlus = function(){
    this.name = 'WidgetPlus';
    this.b = 'b';
};
WidgetPlus.prototype = new Widget(); // XXX: assumption
WidgetPlus.prototype.bar = function(){ return 'bar'; };

// Ignores prototype chain
var copy = function(dest, src){
    Object.keys(src).forEach(function(key){
        dest[key] = src[key];
    });
};

使用WidgetPlus.prototype填充widget_1内容:

var widget_1 = new Widget();
copy(widget_1, WidgetPlus.prototype);
widget_1; // Widget {name: "Widget", a: "a", bar: function, foo: function}

加上复制初始化:

copy(widget_1, new WidgetPlus());
widget_1; // Widget {name: "WidgetPlus", a: "a", bar: function, b: "b", foo: function}

或用widget_1东西覆盖新的WidgetPlus()内容

var widget_1 = new Widget();
var old_widget_1 = widget_1;
widget_1 = new WidgetPlus();
copy(widget_1, old_widget_1);
widget_1; // WidgetPlus {name: "Widget", b: "b", a: "a", bar: function, foo: function}

或者WidgetPlus可能并不真正共享原型链 使用Widget,它们具有完全不同的功能;和 你也想要那些:

copy(widget_1, Widget.prototype);