2

javascript oop で node.js 構造に問題があります。別のクラスを使用してクラスを作成しました。

var base = function (name) {    
    this.Rows = new Array();    
};

var top = function (name) {
    this.name = name;   
};

top.prototype = new base();

var myClass = new top("");
myClass.Rows.push("a");
console.log(myClass.Rows);
var myClass2 = new top("test");
myClass2.Rows.push("b");
console.log(myClass2.Rows);

このコードは次の結果を返します。

[ 'a' ]
[ 'a', 'b' ]

しかし、このコードの結果としてアルゴリズムによって検出される必要はありませんか?

[ 'a' ]
[ 'b' ]

助けてくれてありがとう。

解決済み: この問題を解決しました。コードのリファクタリング;

var base = function (name) {
  this.Rows = new Array();
}

var top = function(name) {
  top.prototype.constructor.call(this, name);
  this.name = name;
}

top.prototype = Object.create(new base());

全てに感謝。

4

2 に答える 2

6

これが、JavaScript のプロトタイプの継承のしくみです。

これは、言語の初心者にとってはかなり混乱しているようです:)

オブジェクトmyClassとの両方myClass2が同じプロトタイプを持っている ( で設定top.prototype = new base();)

これはRows、どちらもプロパティを持たないため、プロパティにアクセスすると、プロトタイプのプロパティにアクセスすることを意味します。どちらも同じなので、どちらも同じオブジェクトに作用します。console.log(myClass2.Rows);コードの最後に 行を追加すると、出力も出力されます[ 'a', 'b' ]

A古典的な言語では、 classが class を拡張すると のBすべてAのプロパティがコピーされるため、プロトタイプの継承は初心者を混乱させるようですB- これは JavaScript には当てはまりません。

コードを次のようにリファクタリングすると、同じ機能を実現できます。

var base = function () {    

};

base.prototype.getRows = function(){
    return this.rows;
}

var top = function (name) {
    this.name = name;   
    this.rows= [];    
};

top.prototype = new base();

var myClass = new top("");
myClass.getRows().push("a");
console.log(myClass.getRows());
var myClass2 = new top("test");
myClass2.getRows().push("b");
console.log(myClass2.getRows());

これにより、期待する「古典的な」結果が得られます。

ただし、JavaScript の原型モデルは機能の共有に重点を置いています。私はおそらくあなたのコードを次のようにリファクタリングします:

var myClass = {Rows:[]},myClass2 = {Rows:[]};
于 2013-03-08T00:53:31.283 に答える
2

はい、プロトタイプは共有されています。このタイプの継承を意図していたと思います:

var base = function (name) {
    this.Rows = new Array();
};

var top = function (name) {
    base.call(this,name); // this replaces your prototype
    this.name = name;
};

var myClass = new top("");
myClass.Rows.push("a");
console.log(myClass.Rows);
var myClass2 = new top("test");
myClass2.Rows.push("b");
console.log(myClass2.Rows);

call はメソッドであるかのように関数を呼び出すため、オブジェクトを として設定し、base特定のプロパティでオーバーライドします。コメントで nbinowitz が指摘したように、これはプロトタイプ メソッドを継承しません。

また、私の最初の提案です。これは非常に気に入っていますが、上記よりも利点はありません。

var top = function (name) {
    this.super=base; // these two lines replace your prototype
    this.super(name);
    this.name = name;
};

このメソッドは「base」をメンバー関数にして呼び出します。「トップ」を新しい「ベース」オブジェクトとして設定し、それをカスタマイズします。Objective C のスタイルに似ているため、変数名として「super」を選びました。

于 2013-03-08T00:59:04.297 に答える