2

私は以下のコードを持っています:

function Class () {
  this.method = function () {
    alert('method');
  };
}

new Class().method();

そしてそれはうまく機能しますが、私が理解しているように、新しいオブジェクトごとに関数が作成されます。これを行う正しい方法はありますか?

</ p>

4

2 に答える 2

5

インスタンス変数の初期化をClass関数に配置し、共有メソッドと変数をプロトタイププロパティに配置します。

function Class (var1, var2) {
  this.var1 = var1;
  this.var2 = var2;
}

Class.prototype.method = function () {
  alert(this.var1 + ' ' + this.var2);
};

new Class('var1', 'var2').method();
​
于 2012-08-28T10:17:21.870 に答える
0

私のアプローチはSperanskyのアプローチとほとんど同じですが、メソッドを直接追加するのではなく、プロトタイプオブジェクトを再宣言します。

// Declare the Constructor function.
function MyClass (name, age) {

    // Assign any member properties here.
    this._name = name;
    this.age = age;
}

// Redefine the prototype object to add methods.
MyClass.prototype = {

    // Re-point the Constructor function as it will be overwritten.
    constructor: MyClass,

    // Custom method which all instances of `MyClass` will inherit.
    sayHello: function () { 
        return "My name is " + this._name + ", how do you do?";
    }
};

使用法:

var foo = new MyClass("Dave", 22);
foo.sayHello();     // "My name is Dave, how do you do?"
foo.age;            // 22

プロトタイプを別のオブジェクトに向けたい場合MyClass(単純な継承モデルを設定するため)、Underscoreのextend方法と同様にミックスインを利用できます。

function BaseClass(name) {
    this._name = name;
}

BaseClass.prototype = {
    constructor: BaseClass,

    sayHello: function () { 
        return "My name is " + this._name + ", how do you do?";
    }
}

class MyClass (name, age) {
    // Call the BaseClass constructor function in the context of `this`
    BaseClass.call(this, name);

    this.age = age;
}

// Mixin the BaseClass's protptype into the MyClass prototype and delcare
// the new methods.
_.extend(MyClass.Prototype, BaseClass.prototype, {
    constructor: MyClass,

    getAge: function () { 
        return this.age;
    }
});
于 2012-08-28T10:27:08.123 に答える