私は以下のコードを持っています:
function Class () {
this.method = function () {
alert('method');
};
}
new Class().method();
そしてそれはうまく機能しますが、私が理解しているように、新しいオブジェクトごとに関数が作成されます。これを行う正しい方法はありますか?
</ p>
私は以下のコードを持っています:
function Class () {
this.method = function () {
alert('method');
};
}
new Class().method();
そしてそれはうまく機能しますが、私が理解しているように、新しいオブジェクトごとに関数が作成されます。これを行う正しい方法はありますか?
</ p>
インスタンス変数の初期化を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();
私のアプローチは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;
}
});