2012-09-29 4 views
-1

그래서 프로토 타입 메서드 내부에서 개인 멤버에 액세스하는 주제에 대해 많은 논의가있었습니다.각 인스턴스에 대해 객체의 프로토 타입을 선언 할 때 오버 헤드가 발생합니까?

function Test(){ 
    var private = "Private"; 
    this.instance = function(){ 
     return private; 
    }; 

    Test.prototype.getPrivate = function(){ 
     return private; 
    }; 
} 
var test1 = new Test(); 
var test2 = new Test(); 
console.log(test1.instance === test2.instance); // false 
console.log(test1.getPrivate === test2.getPrivate); // true 

Turns out는 않습니다, 사실, 일을 : 생각은 다음과 같은 일을해야 나에게 발생했습니다. 그러나 나는 이것을하기에 단점이있을 수 있다고 우려하고 있습니다.

제 질문은 다음과 같습니다. 단점이 있습니까?

답변

4

이것은 당신이 아마 예상대로 작동하지 않습니다 test1의 개인의 getPrivate()test2을 얻는다 '로.

function Test(value){ 
    var private = value; 
    this.instance = function(){ return private; }; 

    Test.prototype.getPrivate = function(){ 
     return private; 
    }; 
} 
var test1 = new Test("test1"); 
var test2 = new Test("test2"); 
console.log(test1.getPrivate()); // test2 
console.log(test2.getPrivate()); // test2 

그래서 실제로 작동하지 않으면 비효율적인지는 중요하지 않습니다.

+0

당신 말이 맞아,하지만 몇 가지 이상한 행동도있다 : http://jsfiddle.net/8DBTq/1/ – Shmiddty

+1

기대하고있는 방식대로 작동하지는 않지만 정상적으로 작동합니다. 프로토 타입은 전역 변수와 같습니다. 모든 인스턴스는 하나의 사본을 공유합니다. 수정하면 모든 인스턴스에 대해 수정됩니다. – chuckj

0

필자는 함수 내부에서 프로토 타입 함수를 정의하는 데 실수를 범한 것으로 생각합니다. 이런 식으로 인스턴스가 생성 될 때마다 모든 인스턴스에서 사용할 수있는 프로토 타입 메서드를 덮어 씁니다 ... 그건 내가 생각하는 이상한 일입니다.

function Test(param){ 
    var private = param; 

    this._getPrivate = function(){ 
     return private; 
    };  
} 
Test.prototype.getPrivate = function(){ 
    return this.instance(); 
};  
var test1 = new Test("One"); 
var test2 = new Test(2); 
console.log(test1.getPrivate()); 
console.log(test2.getPrivate()); 

예상대로 작동합니다.

하지만, 난 당신이 단지 멤버 함수와 클로저를 정의하기위한 ... 만약 당신이 (이 지역 만드는 대신에 추가)처럼 당신이 프로토 타입 기능을 필요로 이해하지 않는 경우 프로토 타입을 사용할 때와 같은 구문을 얻습니다. 흠, 당신이 의도 한 것을 얻지 못했습니다. 당신이 프로토 타입으로 놀고있을 수 있었습니까? ...이라고 생각되다 - - 당신이 속성에 액세스에 관심이 있다면 GG

는하지만, 나는 밖으로했다 코드 (ECMA 스크립트 5 defineProperty)을 살펴 가지고 놀라운 프로토 타입 도구 (즉, 프로토 타입 결점없이 제공) 설탕을 .. . (! 실제로 대해서 PropertyChange 이벤트를 활성화하는 데 사용할 방법을 아주 멋진, 어쨌든 기존의 브라우저에서 작동하지 않습니다 < -> ES 5!)

Object.defineProperty(myObj, MyProp, { 
    'enumerable' : true, 
    'configurable': true, 
    'get': function() { 
     return value; 
    }, 
    'set': function(to) { 
     value = calculateSomething(to); 
    } 
});