2017-01-16 3 views
0

: 초기화 값 (오히려 참조 유형과) 값 타입의 인스턴스 변수에 대한 프로토 타입에 https://developers.google.com/speed/articles/optimizing-javascript#initializing-instance-variablesJavascript에서 참조 유형이있는 인스턴스 변수를 생성자에 넣어야하는 이유는 무엇입니까? 구글 개발자 통찰력에서 발췌 읽기


장소 인스턴스 변수 선언/초기화를 (형식 번호 즉, 값, 부울, null, 정의되지 않음 또는 문자열). 이렇게하면 생성자가 호출 될 때마다 초기화 코드를 불필요하게 실행하지 않아도됩니다. (이것은 그 초기 값 건설시의 생성자 또는 일부 다른 상태로의 인자에 의존 인스턴스 변수들에 대해 수행 될 수 없다.) 예를 들어

대신 :

foo.Bar = function() { 
    this.prop1_ = 4; 
    this.prop2_ = true; 
    this.prop3_ = []; 
    this.prop4_ = 'blah'; 
}; 

사용 :

foo.Bar = function() { 
    this.prop3_ = []; 
}; 

foo.Bar.prototype.prop1_ = 4; 

foo.Bar.prototype.prop2_ = true; 

foo.Bar.prototype.prop4_ = 'blah'; 

내가 LOGI을 이해 c는 값 형식을 갖는 변수를 함수 프로토 타입에 넣는 것을 배제하지만 this.prop3_ = [];과 같은 참조 변수가있을 때 초기화 코드를 실행하지 않습니다. (Google 예제와 같이)? 이것은 생성자를 호출 할 때마다 새로운 배열을 생성하지 않습니까?

+0

"생성자를 호출 할 때마다 새 배열을 만들지 않습니까?" - 그게 핵심입니다. – user2357112

+0

"참조 유형"또는 "값 유형"이 없습니다. 유효한 언어 유형은 [* ECMA-262 §6.1 *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-language-types)에 나와 있습니다. 변수는 값을 가지며 값은 [* 기본 값 *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-primitive-value) 또는 * 참조 * (일명 [* 참조 사양 유형 *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-reference-specification-type)). – RobG

답변

1

참조 유형의 인스턴스 속성을 생성자에 추가해야합니다. 그렇지 않으면 프로토 타입에 추가 할 때 생성 된 객체의 각 인스턴스가 동일한 참조를 공유하게됩니다. 단지 정보를 읽을 때도 괜찮지 만, modyfing 할 때 문제가 발생합니다. instance1.barinstance2.bar 두 객체가 공유 같은 배열 때문에 instance1.bar.push 한 번만 호출 된

var Test = function() { 
    this.foo = []; 
}; 

Test.prototype.bar = []; 

var instance1 = new Test(); 
var instance2 = new Test(); 

instance1.foo.push(1); 
instance1.bar.push(1); 
instance2.foo.push(2); 
instance2.bar.push(2); 

console.log(instance1.foo, instance1.bar); // [1], [1,2] 

하지만 다음의 예를 확인하시기 바랍니다, 배열은,이 개 값이 있습니다.