答えはおそらく機能しますが、プロトタイプを使用しないのはなぜですか? align 関数は、インスタンスごとに異なるロジックを実行しますか?
ベルギが指摘したように。JavaScript はプロトタイプを使用して継承します。インスタンス間で変更されないメンバーをプロトタイプに定義することをお勧めします。
簡単に説明します。プロトタイプは、インスタンスに対して変更されないメンバー/プロパティを宣言するために使用できます。Person という名前のオブジェクトを宣言し、person に name と greeting の 2 つのメンバーがあるとします。挨拶は「こんにちは、私は[this.name]です」と出力するので、挨拶はインスタンス間で変わりません。
Person プロトタイプで greeting メソッドを宣言し、何千もの Person インスタンス (ベン、ジャック、メアリーなど) を作成すると、それらはすべて 1 つのgreet
関数だけを共有します。これにより、オブジェクトの初期化のためのメモリと CPU 時間が節約されます。詳細については、このリンクを確認してください: https://stackoverflow.com/a/16063711/1641941
this
次のリンクは、JavaScript で何が参照されているかを理解するのに役立ちます。https://stackoverflow.com/a/19068438/1641941
function Svg() {
this.someInstanceValue=22;
}
Svg.prototype.align = function(value) {
if(value === 'left') return 0;
}
function Graph() {
// get Svg's instance properties
Svg.apply(this,arguments);
console.log('<text x="' + this.align('left') + '"></text>');
}
//inherit from Svg:
Graph.prototype=Object.create(Svg.prototype);
Graph.prototype.constructor=Graph;
graph = new Graph();
graph.align('left');
Svg から継承したくないが、それを混在させたくない場合でも、prototype を使用してその関数を混在させることができます (必要なインスタンス メンバーを取得するために Svg.apply を呼び出します)。
function mixin(source, target){
for(thing in source){
if(source.hasOwnProperty(thing)){
target[thing]=source[thing];
}
}
};
function Svg() {
this.someInstanceValue=22;
}
Svg.prototype.align = function(value) {
if(value === 'left') return 0;
}
function Graph() {
// get Svg's instance properties
Svg.apply(this,arguments);
console.log('<text x="' + this.align('left') + '"></text>');
}
//mix in Svg:
mixin(Svg.prototype, Graph.prototype)
graph = new Graph();
graph.align('left');