2011-11-15 3 views
0

私は下に継承に取り組んでいる方法に欠点があるかどうか疑問に思っていますか? 考慮するメモリリークはありますか?他の継承パターンより多くのメモリが使用されていますか? 以下の「クラス」パターン(新しい...())を使用してJavaScriptをコード化することをお勧めします...私は他の継承パターンを目立たせ、これを思いついただけです...Javascript継承パターン。フィードバックお願いしますか?

コメントをいただきありがとうございます!

// Class A 
function A() { 

    var that = this; 

    that.hello = function() { 

    return "HELLO"; 

    } 

} 

// Class B 
function B() { 
    var zuper = new A(); 
    var that = this; 

    that.variable = "VARIABLE"; 

    zuper.bye = function() { 

    return "BYE"; 
    } 

    zuper.getVariable = function() { 
    return that.variable 
    } 

    return zuper; 
} 

var b = new B(); 
alert (b.hello()) // "HELLO" 
alert (b.bye()) // "BYE" 
alert (b.getVariable()) // "VARIABLE" 

================================ EDIT ========= ========================== 私は私の元の方法を改訂し、これを思い付いた。これは、私はあなたにプロトタイプについて検討すべきだと思うB

// Class A 
function A() { 

    var that = this; 
    that.publicProperty = "PUBLIC_PROPERTY"; 
    var privateProperty = "PRIVATE_PROPERTY"; 

    that.hello = function() { 
    return "HELLO"; 
    } 

    that.getPrivateProperty = function() { 
    return privateProperty; 
    } 

    that.overrideThis = function() { 
    return "NO_PLEASE_NO"; 
    } 

} 

// Class B 
function B(a, b, c) { 
    A.apply(this, arguments); 

    this.variable = "VARIABLE"; 
    var privateVariable = "PRIVATE_VARIABLE"; 

    this.bye = function() { 

    return "BYE"; 
    } 

    this.getVariable = function() { 
    return this.variable 
    } 

    this.getPrivateVariable = function() { 
    return privateVariable; 
    } 

    this.getAandB = function() { 
    return a + b; 
    } 

    this.getFromSuperPublicPropery = function() { 
    return this.publicProperty; 
    } 

    this.overrideThis = function() { 
    return "MUHAHAHA"; 
    } 

} 

var b = new B("aaa", "bbb"); 

alert (b.hello())  // "HELLO" 
alert (b.bye())   // "BYE" 
alert (b.getVariable()) // "VARIABLE" 
alert (b.getPrivateVariable()) // "VARIABLE"' 
alert (b.getAandB())   // "aaabbb" 
alert (b.getFromSuperPublicPropery()) // "PUBLIC_PROPERTY" 
alert (b.getPrivateProperty()) // "PRIVATE_PROPERTY" 
alert (b.overrideThis()) // MUAHAHAA 


function C() { 
    A.apply(this, arguments); 
} 

var c = new C(); 
alert (c.overrideThis()) // "NO_PLEASE_NO" 
alert (c.bye()) // Expecting an exception here! Correct!  
+3

これは継承ではありません。どのように参照してくださいhttp://stackoverflow.com/questions/7486825/javascript-inheritance – hungryMind

答えて

1

の初めに呼び出しを適用ご覧ください (Bを作成する際に作成した2つのオブジェクト、(AとBの合計))前のものと同じ問題に苦しむんjavascript。この記事 - http://www.sitepoint.com/javascript-inheritance/を参照してください。

+1

その記事はあまり良くありません。親のプロトタイプから子のプロトタイプにプロパティをコピーします。つまり、 'instanceof'は動作しません。さらに、継承を設定した後に親のプロトタイプを変更した場合、子クラスはそれを取得しません。常に行われていることではありませんが、継承チェーンを設定するのが適切な方法です。私は、JSの良い継承の原因について投稿しました。 http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –

0

私は(あなたの例では)次のパターンを使用することをお勧めしたい:

// A function to implement basic inheritance 
function inherit(child, parent) { 
    function F() {}; 
    F.prototype = parent.prototype; 
    child.prototype = new F(); 
    // Reassign the original constructor, explained below 
    child.prototype.constructor = child; 
    // Maybe have a reference to parent prototype 
    // child.superClass = parent.prototype; 
} 

// Class A 
function A() { 
} 

A.prototype.hello = function() { 
    return "HELLO"; 
} 

// Class B 
function B() { 
    this.variable = "VARIABLE";  
} 

inherit(B, A); 

B.prototype.bye = function() { 
    return "BYE"; 
} 

B.prototype.getVariable = function() { 
    return this.variable; 
}; 


var b = new B(); 
alert (b.hello()) // "HELLO" 
alert (b.bye()) // "BYE" 
alert (b.getVariable()) // "VARIABLE" 

//If you reassigned the original constructor to child, you can do the following 
alert (b instanceof B); //true 
alert (b instanceof A); //true 

あなたが望んだ、それは親(オブジェクトA)のインスタンスに反映されないならばあなたはまたB.prototype.helloとして、helloをオーバーライドすることができます。このようにして実際にプロトタイプを使用して関数定義の重複を保存し、実際にプロパティや関数などを継承します。

+0

はい、私は以前このパターンを見てきました。ファンではありません。私は、ラップされた関数内にすべての機能を持つという考えが好きです。パブリックメソッドで使用されるプライベート変数にはアクセスできません。右? this.variableをvar variable = "VARIABLE"にします。変数を返すことはできません。 – momomo

+0

@Hamidamはい、パターンの唯一の欠点は、私的変数をサポートしていないということです。そして、やはりJSで継承を行うのは、もっとも自然な(論理的にもメモリ的にも)方法です。あなたは実際にプライベート変数が必要ですか?彼らは、彼らに許可されていないアクセスを防ぐためのセキュリティとして働いていません(結局JSです)。開発の快適性のために、ほとんどのIDEはオブジェクトのプロパティを見ることができません。論理的な分離のために、すべての "プライベート"変数の先頭にアンダースコアなどを付けることができます。 – zatatatata

+0

はい、私はプライベート変数が必要です。なぜなら、それははるかにクリーンで、別のコーダーがそのメソッドや変数の目的を理解できるからです。プライベートメソッドを宣言すると、このクラス内でのみ使用されることが理解されます。APIを書く場合、明確なガイドラインを書くのに多くの時間を費やしたくない場合には、問題になります。私はあなたの初期の質問に代わるものを書いています。これは、現在のところAを初期化する必要はありません。つまり、私は2つのオブジェクトを作成しています。 – momomo

0

Like HungryMindは継承ではなく、 instanceofは、基本クラスの場合はテストに使用できません。クローズベースのオブジェクト(プライベート変数用)を作成したい場合は、プロトタイプを使用しないin継承スキームが必要です。

のための投稿を参照してください。 JSの継承。 http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html他のスキームを使用することはできませんが、継承がJSでどのように機能するのかを本当に理解するまでは、そうしないでください。

関連する問題