我想知道如何将给定类型的预先存在的对象实例(例如,键入' Widget')转换/扩展为新类型(例如,' WidgetPlus' ),以便实例继承原始和新的所有方法和变量。
所以,如果我有 widget_1 , widget_2 和 widget_3 ,所有这些都被实例化为新Widget(),将这些实例扩展到我的新 WidgetPlus 类的最佳方法是什么?
提前致谢,
安迪
答案 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);
等