[英]Can I use a private method inside my prototype function in JavaScript?
我正在學習OO JavaScript,所以這個問題可能聽起來很奇怪。 問題 : normalize
函數應該是私有的,外部不可訪問/可寫。 問題 :如何從內部prepare
原型函數訪問normalize
?
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);
不,如果該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);
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);
你不能。 JavaScript沒有私有或公共屬性的任何概念,因此人們使用閉包和范圍作為模擬隱私的“黑客”。 但這需要付出代價,即原型方法無法訪問這些“私有”屬性。
在您的具體示例中, normalize
也可以在構造函數外部定義,因為它不依賴於構造函數內部的任何內容:
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);
將normalise
函數定義為范圍內的命名函數,而不是將其放在對象的屬性中:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.