2011-11-10 5 views
3

기본 개체에서 인스턴스 속성을 상속하거나 복사하는 일련의 개체를 만들고 싶습니다. 이로 인해 어떤 패턴을 사용해야하는지에 대한 결정을 내릴 수 있었고 어떤 방법이 "더 나은가"에 대한 의견을 묻기를 원했습니다. 둘 다 공통 템플릿을 기반으로 같은 일, 즉 고유 한 인스턴스 속성을 달성복제 또는 적용 : "더 나은"것인가?

//APPLY: 
// --------------------------------------------------------- 
//base object template 
var base = function(){ 
    this.x = { foo: 'bar'}; 
    this.do = function(){return this.x;} 
} 

//instance constructor 
var instConstructor = function (a,b,c){ 
    base.apply(this);//coerces context on base 
    this.aa = a; 
    this.bb = b; 
    this.cc = c; 
} 

instConstructor.prototype = new base(); 

var inst = function(a,b,c){ 
    return new instConstructor(a,b,c); 
} 

//CLONE 
// --------------------------------------------------------- 
function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
     if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
}  

var x = {foo: 'bar'}; 

function instC(a,b,c){ 
    this.aa = a; 
    this.bb = b; 
    this.cc = c; 
    this.x = clone(x); 
}; 

instC.prototype.do = function(){ 
    return this.x; 
} 

- 질문은 당신이 찾고있는 같은 질문의 소리

+0

'inst.prototype = ...'을 설정하는 것은 정말로 효과가 있습니까? 당신은'inst'를 다음 줄의 함수와 똑같이 할당 했습니까? 그것은'instConstructor.prototype = ... '이되어야합니다. – nnnnnn

+0

좋은 점 - 죄송합니다. - 오타였습니다. – sunwukung

답변

0

좋아, 그래서 좀 더 생각해 봤는데 - 그 답은 유스 케이스 때문이다. 복제가 속성을 지정된 범위로 복사하는 경우 적용은 속성을 둘러싼 범위를 변경하는 것입니다. 전자는 믹스 인에게 좋고 후자는 상속을위한 것입니다.

2

더 "우아한"보이는되는 하나입니다 Object.create과 비슷한 것입니다. 이 함수는 프로토 타입으로 선택한 개체가있는 새 개체를 만드는 데 사용할 수 있습니다.

//for old browsers without Object.create: 
var objCreate = function(proto){ 
    function F(){}; 
    F.prototype = proto; 
    return new F(); 

복제 방법과의 비교에서 다른 방법을 사용하므로 더 적절한 것을 선택해야합니다.

프로토 타입을 사용하면 하위 개체에 대한 부모 개체의 변경 사항을 반영합니다.

this의 방법을 사용할 때는주의해야합니다. 당신이하는 일에 따라 프로토 타입 상속을 너무 많이 사용하면 원하지 않는 결과를 초래할 수 있습니다. 한편

a ={ 
    x: 1, 
    foo: function(){ this.x += 1 } 
} 
b = Object.create(a); 
b.foo(); 
//a.x does not change 

, 당신은 객체가 어떤 방식으로 서로 간섭하지 않을 것이라는 확신 할 수 있도록 클론 물건을 복제 . 때때로 이것은 당신이 원하는 것입니다.

+0

그래, 그 방법을보고 있었지만 몇 가지 문제가 있었어. http://stackoverflow.com/questions/8073055/ 사소한 단점 - 함께 - crockford - 프로토 타입 - 상속/8076515 # 8076515 – sunwukung

+0

당신이 새로운 getPrototypeOf 또는 __ptoto__ 같은 것들을 사용할 수 없다면 객체의 프로토 타입에 대한 핸들을 얻는 것이 까다 롭습니다. 원하는 작업에 따라 복제 할 개체의 메서드를 복사 할 수도 있습니다. – hugomg

관련 문제