2011-10-07 5 views
0

저는 Douglas Crockford의 "Javascript : The Good Parts"서적을 사용하여 처음으로 JavaScript를 배우는 숙련 된 코더입니다. 그것에서는, 그는이 기능을 사용하여 상속하는 '순수 프로토 타입'접근 방식을 사용하는 것이 좋습니다 :JavaScript에서 순수 프로토 타이핑 접근법을 사용할 때 객체 속성을 처리하는 방법

if (typeof Object.create !== 'function') { 
    Object.create = function(o) { 
     var F = function() {}; 
     F.prototype = o; 
     return new F(); 
    }; 
} 

난 데 문제는 그 객체가 생성, 간단한 형식이 아닌 객체가 아니라의 속성을 가질 때 새 객체는 새 객체를 만드는 것이 아니라 객체의 부모 인스턴스를 상속받습니다. 예를 들어 :

Person Jeff has 2 arms and 2 legs. 
Cat Bob has 0 arms and 0 legs. 
Now person Jeff has 0 arms and 0 legs. 

내가 아니라 '몸'에 대한, 단순한 '이름'속성에 대한 예상되는 동작을 얻을 :

var aBody = { 
    arms : 2, 
    legs : 2 
}; 

var person = { 
    name : 'Jeff', 
    body : Object.create(aBody) 
}; 
document.writeln('Person '+person.name+' has '+person.body.arms+' arms and '+person.body.legs+' legs.'); 

var cat = Object.create(person); 
cat.name = 'Bob'; 
cat.body.arms = 0; 
cat.body.legs = 0; 

document.writeln('Cat '+cat.name+' has '+cat.body.arms+' arms and '+cat.body.legs+' legs.'); 
document.writeln('Now person '+person.name+' has '+person.body.arms+' arms and '+person.body.legs+' legs.'); 

이 출력이 있습니다. 제 생각에는 JavaScript가 참조로 복사 되었기 때문에 새로운 aBody 인스턴스가 생성되지 않기 때문입니다. 예를 들어 person에서 개체를 만들 때마다 수동으로이 작업을 수행 할 수 있습니다. cat.body = Object.create(aBody)하지만 원래 개체 정의 (여기, person)로 롤백하는 깔끔한 방법을 찾을 수 없었습니다.

좋은, 명확하고 신뢰할 수있는 JS 코드를 작성하는 법을 배우려는 데 제가 제공 할 수있는 지침을 정말 고맙게 생각합니다. '순수하게 프로토 타이핑 (prototypal)'접근법을 사용하는 사람들이이 문제를 다루는 영리한 기술이 있습니까?

답변

1

프로토 타입 개체의 전체적인 점은 클래스 전역 속성을 수용 할 장소를 제공하는 것입니다. 따라서 프로토 타입 상속이 지원하려는 기능이라는 것을 실제로 볼 수 있습니다.

인스턴스가 속성을 공유하지 않게하려면 속성을 인스턴스에 직접 배치하십시오.

if (typeof Object.create !== 'function') { 
    Object.create = function(o) { 
     var F = function() {}; 
     F.prototype = o; 
     var obj = new F(); 
     if (o.init && typeof o.init === 'function') 
      o.init.call(obj); 
     return obj; 
    }; 
} 

아니 당신이 "aBody"를 수정할 수 있습니다 :

가 나는하는 초기화 방법을 확인하기 위해 오지 그릇의 기능을 일반화 할 당신이 그와 인스턴스를 만들 때

var aBody = { 
    init: function() { 
    this.body = { arms: 2, legs: 2 }; 
    } 
}; 

것은, 그들이해야 자신의 자신의 "본문"속성.