0

クラスのルートにある関数と他のサブ関数の両方を持つことができる JavaScript で「クラス」を作成しようとしています。

Validate(word)- 単語が検証された場合、true または false を返します

Validate.getRule()- 単語の検証に使用されるルールを返します。

コード例は次のとおりです。

var Validate = function (word)
{
  this.rule = /^[a-m]$/;

  if (word)
  {
     return this.rule.test(word);
  }
  else
  {
     return {
        getRule   :   function()
           { return this.rule;}
            };
  }

}();

これは、引数なしで呼び出すと最初は機能しますが、2 回目は次のエラーが発生します。

TypeError: object is not a function
4

2 に答える 2

2

範囲の問題があります。

var Validate = function (word)
{
  var that = this;

  this.rule = /^[a-m]$/;
  if (word)
  {
     return this.rule.test(word);
  }
  else
  {
     return {
        getRule   :   function()
           { return that.rule;}
            };
  }

}();
于 2012-09-04T21:51:33.860 に答える
1

関数を直接呼び出しているため、wordパラメーターは常に未定義でthisあり、グローバルスコープ(window)であるため、コードは次のように動作します。

var rule = /^[a-m]$/;
var Validate = {
  getRule: function() { return this.rule; }
};

関数とオブジェクトの両方として機能するものが必要な場合は、関数を宣言してから、プロパティを追加します(関数は実際にはオブジェクトであるため)。

var Validate = (function(){

  var rule = /^[a-m]$/;

  function validate(word) {
    return rule.test(word);
  }

  validate.getRule = function() { return rule; };

  return validate;

})();
于 2012-09-04T21:56:52.963 に答える