2012-08-11 2 views
1

JavaScript 언어는 클래스 또는 클래스 기반 상속을 직접 지원하지 않습니다.인스턴스 기반의 효율적인 개인 기능 | 실행 시간이 필요합니다

그러나 JavaScript에는 많은 클래스가 구현되어 있습니다.

필자가 본 모든 구현에서는 인스턴스 기반의 효율적인 개인 기능을 만들기 위해 자체 호출 함수를 사용해야합니다.

함수는 개인 정보 보호를

var foo = function(){ /* private to foo here */ }; 

을 가지고 있지만 당신이 그것을 떨어져 프로토 타입 경우 당신은 지금 공개, 인스턴스 기반의 효율적인 회원이있다.

foo.prototype.func = function(){ /* private to func */ }; // foo.func in public now. 

var foo = function() { 
    var funcInner = function(){}; 
}; // funcInner is now re-defined in each call to foo. In-efficient. 

처럼 foo는에서 함수를 배치하면 누락 된 개인 정보를 얻을 수 있지만, 지금에-효율성이 있습니다. 따라서

전용 예 기반 효율적인 기능을 가질 수있는 유일한 방법은 전화 등

var NS = (function(){ 
    var private = function(){ /* code */ }; // only created once b.c. in module pattern. 
    var publik = {}; 
     publik.funcPublic = function(){ /* code */ }; 
    return publik; 
})(); 

같이 모듈 패턴 (또는 유사한 자기 호출 패턴)를 사용하는 것이다

NS.funcPublic(); 

이것으로 인스턴스 기반의 효율적인 개인 기능을 갖춘 것으로 보이며 실행 시간이 짧아야합니다.

이 정보가 맞습니까?

답변

1

제시 한 모듈 패턴은 좋은 해결책이 아닙니다. 객체 publik을 반환하지만 클래스를 시뮬레이트 할 가능성이 가장 높습니다. 따라서 new 연산자를 사용하여 publik 유형의 새 인스턴스를 만드는 것이 좋습니다. 객체와 함께 작동하지 않으므로 새 인스턴스를 만들 때마다 익명의 함수를 호출해야합니다. 인스턴스마다 새로운 private 함수가 생깁니다. (당신이 설명이 필요한 경우이 이해가 확실하지 않은 경우, 문의하시기 바랍니다!)

나는 실제로 꽤 잘 작동하는 솔루션을 제공 할 수 있습니다

var Car = (function() { 
    // Private functions as local variables: 
    var privateFunc = function(self) {};   

    // Create a local variable that will be the class (a function, to 
    // enable the "new" keyword. 
    var Car = function() {}; 

    // Attach public methods to the prototype! That's the most efficient way. 
    Car.prototype.publicFunc = function() { 
     privateFunc(this); // the private functions needs probably 
          // to know about the current instance 
    }; 

    // Now return only the completed "class", to get it out into the wild 
    return Car; 
})(); 

var bmw = new Car(); 
bmw.publicFunc(); 
+0

현재 익명 자체 실행 함수가 반환하는 개체를 사용하지 않습니다. 따라서 대답은 아니오입니다. 그러나 반환 된 객체를'var p = (function() ...)();'에 저장하면 p는 "funcPublic"이라는 속성 하나를 가진 객체를 포함합니다. 그래서'p.funcPublic() ; '작동합니다. 단일 "인스턴스"만 있으면됩니다. – Niko

1

확실하지 당신이 무슨 뜻인지를. 즉각적으로 호출 된 함수 (iif)에서 생성 된 객체 내에서 사물을 비공개로 유지하는 것입니까? 그럼이게 당신이 의미 한 것이겠습니까?

var x = (function(){ 
    var n = 1;           //n = private 
    var getSetN = function(val){ n+=val||0; return n; } // getSetN = private 
    var public = function(){}; 
    public.prototype.getset = function(val){ return getSetN(val||0); }; 
    return public; 
}()); 
var y = new x; z = new x; 
y.getset(1); //=> 2 
y.getset(5); //=> 7 
z.getset(1); //=> 8 
y.getset(); //=> 8 

Ergo 개인 변수와 함수가 사용되는 iif에서 전달 된 생성자에서 인스턴스를 만들 수 있습니다.

+0

당신은 당신의 프라이버시를 얻기 위해 매우 작은 프로세서를 사용했습니다 ... 그렇지 않았습니까? –

+0

아직 그 의미가 확실하지 않습니다. 당신은 명확히 할 수 있습니까? 어떤 코드가 아주 작은 프로세서 *를 사용합니까?'x'의 할당에서 모든 것이 한번 할당됩니다. 생성자는 이미 할당 된 변수를 클로저로 사용합니다. 능률적으로 당신이 의미하는 것이 아니겠습니까? – KooiInc

+0

(function() {})(); 바로 호출 된 함수입니다 ... –

관련 문제