1

私はOO JavaScriptを学んでいるので、この質問は奇妙に聞こえるかもしれません. 問題:normalize関数は非公開にする必要があり、外部からアクセス/書き込みすることはできません。質問:プロトタイプ関数normalize内からアクセスするにはどうすればよいですか?prepare

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);
4

4 に答える 4

1

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);
于 2013-02-08T14:28:47.980 に答える
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);
于 2013-02-08T14:27:23.013 に答える
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);
于 2013-02-08T14:27:32.903 に答える
1

できません。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);
于 2013-02-08T14:27:42.023 に答える