2013-02-08 2 views
1

OO 자바 스크립트를 배우므로이 질문이 이상하게 들릴 수 있습니다. 문제 : normalize 함수는 private이어야하며 외부에서는 액세스/쓰기가 불가능합니다. 질문 : normalize에 액세스하려면 prepare 프로토 타입 기능 내부에서 어떻게해야합니까?JavaScript의 프로토 타입 함수에서 private 메서드를 사용할 수 있습니까?

var AuthHmac = AuthHmac || (function(_, CryptoJS) { 
    function AuthHmac(options) { 
     var options = options || {}, 
      normalize = function(s) { return s.toLowerCase(); }; 

     this.additionalHeaders = options.additionalHeaders || {}; 
    }; 

    AuthHmac.prototype.prepare = function(request) { 
     request.headers = request.headers || {}; 

     _.each(this.additionalHeaders, function(value, name) { 
      request.headers[this.normalize(name)] = value; 
     }); 
    }; 

    return AuthHmac; 

})(_, CryptoJS); 

답변

1

수 없습니다. JavaScript는 개인 또는 공용 속성에 대한 개념이 없으므로 사람들은 개인 정보를 시뮬레이션하기 위해 "해킹"으로 폐쇄 및 범위 지정을 사용합니다. 그러나 프로토 타입 메소드는 이러한 "개인"속성에 액세스 할 수 없다는 점에서 비용이 발생합니다.

var AuthHmac = AuthHmac || (function(_, CryptoJS) { 

    var normalize = function(s) { return s.toLowerCase(); }; 

    function AuthHmac(options) { 
     var options = options || {}; 
     this.additionalHeaders = options.additionalHeaders || {}; 
    }; 

    AuthHmac.prototype.prepare = function(request) { 
     request.headers = request.headers || {}; 

     _.each(this.additionalHeaders, function(value, name) { 
      request.headers[normalize(name)] = value; 
     }); 
    }; 

    return AuthHmac; 

})(_, CryptoJS); 
+1

나는 어휘 범위 지정을 호출하고 "해킹"을 닫는 데 동의하지 않습니다. 비용도 사소하다. – jAndy

+0

즉,'var normalize'는 로컬 변수이고'AuthHmac'에서 사용할 수 있습니다. 그렇습니까? 생성자 밖에서'normalize '를 정의하는 불리한 점은 (제안한대로)? – gremo

+0

@jAndy : "해킹"IMO가 아닌 사설 속성을 시뮬레이트하는 데 이러한 개념을 사용하는 경우 (따옴표 안에 해킹을 적어 두십시오. 개념을 만드는 응용 프로그램입니다). –

1

아니, 즉 normalize 기능은 생성자 함수에 범위가없는 경우.

그러나 이후 기능은 사용자가 쉽게 외부를 넣을 수 있습니다 (즉, 생성자의 지역 변수에 액세스 할 수 있습니다) 특권 할 필요는 없습니다 그것은 여전히 ​​모듈에 개인 될 것입니다 :

var AuthHmac = AuthHmac || (function(_, CryptoJS) { 

    function normalize(s) { return s.toLowerCase(); } 

    function AuthHmac(options) { 
     var options = options || {}; 

     this.additionalHeaders = options.additionalHeaders || {}; 
    }; 

    AuthHmac.prototype.prepare = function(request) { 
     request.headers = request.headers || {}; 

     _.each(this.additionalHeaders, function(value, name) { 
      request.headers[normalize(name)] = value; 
//       ^^^^^^^^^ 
// No `this.`! "private attributes" in JS are variables, not properties 
     }); 
    }; 

    return AuthHmac; 

})(_, CryptoJS); 
1
var AuthHmac = AuthHmac || (function(_, CryptoJS) { 

function normalize(s) { return s.toLowerCase(); } 

function AuthHmac(options) { 
    var options = options || {}; 

    this.additionalHeaders = options.additionalHeaders || {}; 
}; 

AuthHmac.prototype.prepare = function(request) { 
    request.headers = request.headers || {}; 

    _.each(this.additionalHeaders, function(value, name) { 
     request.headers[normalize(name)] = value; 
    }); 
}; 

return AuthHmac; 

})(_, CryptoJS); 
1

가 내부라는 이름의 함수로 normalise 함수를 정의 : 특정 예에서

는하지만, normalize도는 생성자 함수 내부에 아무것도에 의존하지 않기 때문에, 생성자 함수 외부에서 정의 될 수있다 범위 대신 객체의 속성에 넣어야합니다.

var AuthHmac = AuthHmac || (function(_, CryptoJS) { 

    function normalize(s) { 
    return s.toLowerCase(); 
    } 

    function AuthHmac(options) { 
    var options = options || {}; 

    this.additionalHeaders = options.additionalHeaders || {}; 
    }; 

    AuthHmac.prototype.prepare = function(request) { 
    request.headers = request.headers || {}; 

    _.each(this.additionalHeaders, function(value, name) { 
     request.headers[normalize(name)] = value; 
    }); 
    }; 

    return AuthHmac; 

})(_, CryptoJS); 
관련 문제