2014-11-17 2 views
2

주어진 유형 (예 : '위젯 유형')의 기존 객체 인스턴스를 새로운 유형으로 변환/확장하는 방법을 알고 싶습니다. 'WidgetPlus'), 인스턴스는 원본과 새의 모든 메소드와 변수를 상속받습니다.사실 인스턴스 인스턴스의 유형을 변경하는 방법

그래서 나는 나의 새로운 WidgetPlus 클래스에이 인스턴스를 확장하는 가장 좋은 방법이 무엇인지 새로운 위젯()으로 인스턴스화 된 모두 widget_1, widget_2 및 widget_3이있는 경우 ? 사전에

감사합니다, 그것은 당신이 정말 달성하려는 작업에 따라

앤디

+0

방금 ​​변경 안 프로토 타입? 'widget_1.prototype = WidgetPlus'와 비슷합니다. – justanothercoder

+0

@justanothercoder : 아니요, 작동하지 않습니다. – Bergi

+1

왜 첫 번째 경우에'new WidgetPlus'를 사용하지 않았습니까? 당신이 필요로하는 것을 어떻게 결정합니까? 언제 변화합니까? 두 유형의 차이점은 무엇입니까? 'WidgetPlus'는'Widget'의 하위 클래스입니까? – Bergi

답변

0

. WidgetPlus.prototype 물건과

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

덮어 쓰기 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} 

아니면 어쩌면 위젯 플러스는 프로토 타입 체인 을 위젯과 공유하지 않으며 완전히 다른 기능을 가지고 있습니다. 그리고 당신은 그 역시 원하는 :

copy(widget_1, Widget.prototype); 

등 이러한 개체의

관련 문제