簡體   English   中英

我可以在JavaScript中的原型函數中使用私有方法嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM