【问题标题】:How to change type of an object instance after-the-fact如何事后更改对象实例的类型
【发布时间】:2015-01-14 16:07:12
【问题描述】:

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

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

提前致谢,

安迪

【问题讨论】:

  • 你不应该只是改变这些对象的原型吗?就像widget_1.prototype = WidgetPlus
  • @justanothercoder:不,那行不通
  • 第一种情况你为什么不使用new WidgetPlus?你如何确定你需要哪一个,什么时候改变?这两种类型有什么区别? WidgetPlus 是 Widget 的子类吗?

标签: javascript oop object


【解决方案1】:

这取决于您真正想要达到的目标。

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);

等等

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多