2014-04-24 3 views
2

이 기능의 샘플 :자바 스크립트 생성자 최우선

function User (name) { 
    this.options.name = name; 
}; 

User.prototype.options = { 
    name: 'Default' 
}; 

var foo = new User('foo'); 
var bar = new User('bar'); 

console.log(foo.options.name); // 'bar' 
console.log(bar.options.name); // 'bar' 

문제는, 어떻게 '갑'과 '바'를 얻을 수 있습니다? 감사합니다

+0

알아 냈습니다. 고맙습니다! – Defari

+0

구성원을 변경하고 할당하는 것은 차이가 있습니다. 프로토 타입에 공유 멤버를 지정하면 섀도 잉됩니다. 변경하면 모든 인스턴스의 공유 멤버가 변경됩니다. 여기에 자세하게 설명되어 있습니다 : http://stackoverflow.com/a/16063478/1641941 – HMR

답변

3

생성자의 프로토 타입에 아무 것도 추가하면 모든 인스턴스에서 공유됩니다. 기능을 위해서는 가장 좋은 방법이지만 데이터에는 적합하지 않을 수도 있습니다. 그래서, 당신처럼, 생성자 자체에 options 객체를 생성 할이

function User(name) { 
    this.options = { 
     name: name || "Default" 
    }; 
} 

이 같이 할 때, User의 객체가 생성 될 때마다, 각 개체는 자신의 options 개체를 얻을 것이다. 따라서 하나의 객체로 options을 변경해도 다른 객체의 options에는 영향을주지 않습니다.

+0

당신은 데이터에 가장 적합하지 않다고 말합니다. 원하는 것이 무엇인지, 프로토 타입의 속성을 정의하는 것은 인스턴스. 예를 들어 인스턴스 카운터를 추가 할 수 있습니다. –

+0

@ ThorstenArtner'Austria '그 문장을 조금 변경했습니다. :) – thefourtheye

+0

프리미티브 값은 대개 프로토 타입에 있으므로 인스턴스를 통해 변경할 수없는 기본 값을 가지므로 다시 할당 (변경 불가능한 프리미티브를 변경하는 유일한 방법)으로 인해 멤버가 섀도 잉됩니다. – HMR

관련 문제