2013-11-03 3 views
0

제 생각에 프로토 타입 체인의 것들은 객체 당 한 번만 생성되고 인스턴스 변수를 만들려면 this을 사용해야합니다. 이 올바른지? 예를 들어JavaScript로 인스턴스 변수를 만드는 방법은 무엇입니까?

하십시오 foo1은 두 인사의 값하지만 하이의 하나를 만들 것에서는 foo2 만들기

function Foo() { 
    this.some_instance = "hello"; 
} 
Foo.prototype.some_static = "hi"; 

구현

var foo1 = new Foo(); 

var foo2 = new Foo(); 

.

이 정보가 맞습니까?

+1

예 'some_static' 변수는 각 인스턴스에 대해 다시 생성되지 않으며 프로토 타입 체인에 존재합니다. – megawac

+0

이런 종류의 일은 매우 쉽게 테스트 할 수 있습니다. –

+1

+1 @megawac, [this] (http://stackoverflow.com/questions/6986794/why-are-instance-methods-defined-in-the-prototype-but-instance-fields-are-define) 유용한 질문 – hiattp

답변

3

짧은 답변 : 예.

증명 :

function Foo() { 
    this.some_instance = "hello"; 
} 

var foo1 = new Foo(); 
Foo.prototype.some_static = "hi"; // in between 
var foo2 = new Foo(); 

foo1.some_static === foo2.some_static; // return true 
+1

Thats 가난한 테스트 더 좋은 테스트는'Foo.prototype.some_static = {a : 1}' – megawac

+0

입니다. megawac에 동의합니다. "hi"=== "hi"만이 some_static을 this.some_static로 정의 할 수 있습니다. , "hi"를 지정하면 === 여전히 true가됩니다.megawac이 지적했듯이 속성에 값을 할당하면 JS가 프로토 타입 체인을 찾지 않게되므로 속성 값으로 변경할 수있는 객체가있을 때 공유를 확인할 수 있습니다. 대신 인스턴스에서 해당 속성을 만들고 값을 할당합니다. 'foo1.some_static = ...'는 foo1 인스턴스에 some_static을 생성합니다. http://stackoverflow.com/a/16063711/1641941 – HMR

2

음, foo1은 제작과에서는 foo2는 "안녕하세요"의 값을 생성하지 않습니다. foo1과 foo2를 생성하기 전에 "hi"값을 가진 "some_static"변수가 Foo 프로토 타입 객체에 이미 생성되었습니다.

Foo 프로토 타입을 사용하는 개체를 만들고 "some_static"속성을 참조하면 개체 자체를 먼저 찾습니다. 객체에 "some_static"속성이 없으면 프로토 타입 객체에서 해당 객체를 찾습니다.

하지만 동일한 프로토 타입을 사용하는 각 개체에 고유 한 속성을 만들려면 프로토 타입이 아닌 개체 자체에 속성을 설정해야합니다. 객체의 메서드 중 하나에서 "this.some_instance"를 설정하거나 외부에서 "foo1.some_instance"를 설정하여이 작업을 수행 할 수 있습니다.

관련 문제