2

「コンストラクター」に関数を追加すると、次のように他の関数で拡張できます。

var MyClass = function() {
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(this.time(), "HH:mm"); }
}

次のようにプロトタイプで関数を作成すると、これを行う良い方法がわかりません。

var MyClass = function() {}
MyClass.prototype = {
    time: function() { return 4.5; },
    time.formatted: function () { ... } // This does not work!
}


MyClass.prototype.time.formatted = function() { ... }
// the line above works but I don't like it since it separates everything.
// e.g. if I have 15 functions inside prototype, the .formatted will be like
// 50 lines apart from the time: function

*編集: * 再考すると、上記の行は機能しません。.formatted を追加すると、これへの参照が混乱します。もしかして解ける?

任意のヒント?ありがとう!

4

2 に答える 2

2

プロトタイプオブジェクトを作成する前に関数を作成します。これにより、プロパティを追加でき、以下を使用せずに関数を使用できるようになりますthis

function MyClass() {}

function time() { return 4.5; }
time.formatted = function() { return format(time(), "HH:mm"); }

MyClass.prototype = {
    time: time;
}

これを関数式に入れてまとめ、timeグローバルスコープに関数を含めないようにすることができます。

function MyClass() {}
MyClass.prototype = (function(){

  function time() { return 4.5; }
  time.formatted = function() { return format(time(), "HH:mm"); }

  return {
    time: time;
  }

})();

注:formatted関数は、オブジェクトのメソッドとしてではなく、通常の関数として呼び出されます。これは、関数から呼び出されたときに関数timeがアクセスできないことを意味します。thisformatted

それが必要な場合はtime、プロトタイプにその機能を含めることはできません。クラスの各インスタンスには、独自のバージョンのtime関数が必要です。この場合、formattedプロパティはオブジェクトの特定のインスタンスにアクセスできます。

function MyClass() {

  this.theTime = 4.5;

  this.time = function() { return this.theTime; }

  var t = this;

  this.time.formatted = function() { return format(t.time(), "HH:mm"); }

}
于 2013-02-17T10:22:09.280 に答える
1

このコードは機能しません:

var MyClass = function() {
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(this.time(), "HH:mm"); }
}

var m = new MyClass();
console.log(m.time.formatted())

this内側が を.formatted指しているので、m.timeではありませんm。以下を使用する必要があります。

var MyClass = function() {
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(this(), "HH:mm"); }
}

また

var MyClass = function() {
    var self = this;
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(self.time(), "HH:mm"); }
}

実際の質問に答えて、ヘルパー関数を作成します。

var callable(f, props) {
    for(p in props) f[p] = props[p];
    return f;
}

MyClass.prototype = {
    time: callable(function() {
        return 4.5;
    }, {
        formatted: function () { return format(this(), "HH:mm"); }
    })
}
于 2013-02-17T10:16:25.887 に答える