2014-10-21 1 views
0

나는 여러 번 instanciate 자바 스크립트 "클래스"가 있습니다. 제 문제는 인스턴스에서 속성을 수정하면 실제로 "클래스"의 속성이 수정되므로 더 이상 인스턴스가 원하는 방식으로 초기화되지 않습니다. 여기 무슨 일의 단순화 된 조각이다, 원래의 코드는 BackboneJS를 사용하고 있지만 내 경우 설명하기에 충분하다 : 나는 "새로운"키워드가 브랜드를 만들 것이라고 생각"class"속성에 대한 참조를 만드는 자바 스크립트 "new"키워드

var foo = function() { 
 
    this.defaults.id = 1; 
 
}; 
 
// This is my property 
 
foo.prototype.defaults = { 
 
    id: 0, 
 
}; 
 
console.log(foo.prototype.defaults); // => {id: 0} 
 
var bar = new foo(); 
 
console.log(foo.prototype.defaults); // => {id: 1}

을 새로운 객체이지만 프로토 타입 속성에 대한 참조를 만드는 것처럼 보입니다. 가장 좋은 옵션은 생성자 내부에서 모든 속성을 복제하는 것입니다 ...

깨끗한 "클래스 속성"동작을 달성하기위한 깨끗한 방법이 있습니까?

미리 감사드립니다.

로맹.

편집 : SO 코드 조각에서 작동하지 않습니다 ... 원하는 경우 콘솔에 복사하여 붙여 넣기 만하면됩니다.

+0

'new'는 실제로 새로운 인스턴스를 생성하지만 인스턴스 **는 모든 인스턴스에서 공유되는 프로토 타입에 ** 점을 만듭니다. 포인터를 할당하면 값을 복사 할 필요가 없습니다. 따라서'defaults'가 공유된다면 그 속성을 수정하는 것도 공유됩니다. –

답변

2

prototype은이 유형의 모든 개체간에 공유됩니다. 새 사본이 만들어지지 않습니다. 이 경우 고유 수있는 속성을 초기화 할 수있는 일반적인 방법은 생성자에서 직접 초기화하는 것입니다

this.property = "foo"; 

이 프로토 타입에 같은 이름의 속성을 재정의하고 인스턴스마다 고유합니다.


일반적으로 프로토 타입은 모든 인스턴스간에 공유되기 때문에 데이터 속성에 사용되지 않습니다. 기본 데이터 속성 집합을 사용하여 개체를 초기화하려는 경우 개체 인스턴스에 기본 속성 집합을 할당 한 다음 재정의를 설정하는 것이 "최상의 방법"입니다. 복사가 아닌 포인터로 객체를 할당하므로 모든 객체가 동일한 객체를 가리킬 수 있으므로 기본 객체를 지정할 수 없습니다 (프로토 타입을 사용할 때와 동일한 문제).


이 같은 일련의 기본값으로 개체를 초기화 할 수 있습니다 :

var foo = function() { 
    this.defaults = {}; 
    // copy default properties 
    for (var prop in foo.defaults) { 
     this.defaults[prop] = foo.defaults[prop]; 
    } 
    this.defaults.id = 1; 
}; 

// defaults (not on the prototype) 
foo.defaults = { 
    id: 0, 
    something: "whatever", 
    line: 22 
}; 

비록 실제로, 그것은 일반적으로 같은 기본값에서 단지 코드를 쉽게 :

var foo = function() { 
    this.options = { 
     id: 1, 
     something: "whatever", 
     line: 22 
    }; 
}; 
+0

안녕하세요 jfriend00, 나는 참으로 유일한 길인 것 같습니다. 설명해 주셔서 감사합니다. – Romain

관련 문제