2014-04-27 2 views
2

나는 OOP JS에 developer.mozilla.org 가이드를 읽고이 조각 건너 온 한 (성) 이미 this.gender로 정의되면 내가 이해하지 못하는JavaScript OOP 프로토 타입이 생성자 외부입니까?

function Person(gender) { 
    this.gender = gender; 
} 

Person.prototype.gender = ''; 

Person.prototype.sayHello = function() { 
    alert ('hello'); 
}; 

var person1 = new Person('Male'); 
var person2 = new Person('Female'); 

// call the Person sayHello method. 
person1.sayHello(); // hello 

; 왜 우리는 Person.prototype.gender = ''; 선? 생성자가 아닌 함수의 경우에는이 함수를 이해하지만 해당 행이 this.gender를 반복하는 것처럼 보입니다. 선. 나는 성 (gender)을 Person() 객체의 속성으로 생성한다는 것을 이해하지만, this를 반복하지 않습니다. gender?

나는 모든 설명을 주시면 감사하겠습니다. 저는 OOP JS를 처음 사용합니다. 감사!

+0

을 요구하는 기본을 정의하는 데 도움이 될 수 있습니다, 당신은 필요가 없습니다 그것. 보통 프로퍼티가 조건부로 만 생성되고 그렇지 않으면 프로토 타입에서 기본값을 상속하는 경우에만 이러한 작업이 수행됩니다. – Bergi

+0

정말로 기술적이며 직접 질문과 관련이 없지만 다음과 같이 관심을 가질 수 있습니다. [공간을 절약하기 위해 프로토 타입에 속성의 기본값을 두어야합니까?] (http://codereview.stackexchange.com/questions/28344/) should-i-put-default-values-of-the-prototype-to-save-space)를 사용하면됩니다. –

답변

5

Person.prototype.gender = '';을 추가하면 해당 사람은 "기본"성별을가집니다. 인스턴스화시 성별을 지정하지 않으면 Person의 성별을 정의하는 것과 같습니다. this.gender = gendergender일 때 정의되지 않음은 여전히 ​​값을 지정하는 것으로 계산됩니다.

명백한 경우 사용자에게서 gender 속성을 삭제하려고하면됩니다. Person.prototype.gender = '';을 생략 할 경우, 다음과 같은 경우가 발생할 수 있습니다 더 이상 gender이없는

var person1 = new Person('Male'); 

// check gender 
person1.gender === 'Male'; // true 

// remove gender property from person1 
delete person1.gender; 

person1.gender === undefined; // true 

person1 있기 때문에 그 사람의 생성자에서 프로토 타입 체인을 볼 것이다, 그래서이,이 사람의 인스턴스를 참조 할 수 없습니다 . 그리고 생성자 this.gender = gender;이 인스턴스 속성이기 때문에 거기에서 찾을 수 없습니다. 조회 프로세스는 속성을 찾을 때까지 프로토 타입 체인을 계속합니다. 우리는 다음과 같은 경우

지금 생각해

function Person(gender) { 
    this.gender = gender; 
} 

Person.prototype.gender = 'Asexual'; 

var person1 = new Person('Male'); 
var person2 = new Person('Female'); 
var person3 = new Person(); 

// check genders, looking at instance property 
person1.gender === 'Male'; //true 
person2.gender === 'Female'; //true 
person3.gender === undefined; //true 

// remove their genders 
delete person1.gender; 
delete person2.gender; 
delete person3.gender; 

// check genders again, now it's looking up the prototype chain 
person1.gender === 'Asexual'; //true 
person2.gender === 'Asexual'; //true 
person3.gender === 'Asexual'; //true 
+0

고마워, 그게 내가 원하는거야. Object.Prototype.Property가 후퇴하는 것은 당연한 일입니다. – user3412869

1

짧은 대답은 선, 당신은 본질적으로이 같은 일을 기본값 만 있다는 것입니다 : 당신은 사람을 만들고,

function Person(gender) { 
    this.gender = gender || ''; 
} 

Person.prototype.sayHello = function() { 
    alert ('hello'); 
}; 

var person1 = new Person('Male'); 
var person2 = new Person('Female'); 

// call the Person sayHello method. 
person1.sayHello(); // hello 

만약을하고 성별에 전달하지 않습니다, this.gender는 undefined로 설정됩니다.

그래서 속성을 보면 개체 자체의 속성을 검색합니다. 그러면 정의되지 않은 것으로 판명 될 것이므로 프로토 타입에서 찾아보고 정의되지 않은 빈 문자열을 찾습니다.

따라서이 값은이 경우에만 기본값이며,이 패턴을 사용하지 않고 메서드가 아닌 값을 사용하지 않는 것이 좋습니다.

+0

OP의 코드를'person2 = new Person()'이라고 가정하면,'person2.gender'는'undefined'로 설정되어 있습니다. 당신이 호출 할 때만'undefined' (그것은 _set_에서'undefined' 속성입니다)로 설정되어 있기 때문에 'delete person2.성 (gender) '으로 설정하면 성 (gender) 속성이 설정되지 않은 채로 프로토 타입의 값이 검색되고 그 경우에는' ''를 반환합니다. 그러므로'this.gender = gender'를 사용하면 매개 변수가 전달되지 않으면'Person.prototype.gender = '';를 기본값으로 사용하지 않습니다. –

+0

그러면 매개 변수가 전달되지 않으면 this.gender가 프로토 타입 값으로 기본 설정되지 않을 경우 Person.prototype.gender를 설정하는 포인트는 무엇입니까? 필자는 Person.prototype.gender 행을 사용하거나 사용하지 않고 코드를 실행했으며 어떤 방식 으로든 작동하므로 매개 변수가 전달되지 않으면 프로토 타입 값을 기본값으로 설정하는 것이 좋습니다. 그것? – user3412869

0

는 아마도 약간 다른 구문이 경우에 대한

var Person = (function() { 
    function Person(gender) { 
     this.gender = gender || ''; 
    } 
    Person.prototype.greet = function() { 
     return "Hello, " + this.gender; 
    }; 
    return Person; 
}()); 

// Create instance 
var greeter = new Person(); 
관련 문제