2

次のコードでは、2 つの Book Collection を使用しています。1 つのコレクションには「Moby Dick」があり、もう 1 つのコレクションには「The Firm」があります。しかし、2 番目のコレクションを見ると、Moby Dick もあります。同じデータを共有しないブックを作成するにはどうすればよいですか?

function Collection () {
    var stuff = [];
    this.get = function () {
        return stuff;
    };
    this.add = function (item) {
        stuff.push(item);
    };
}
function Books () {}
Books.prototype = new Collection ();

var myBooks = new Books();
myBooks.add("Moby Dick");

var yourBooks = new Books();
yourBooks.add("The Firm");

console.log(yourBooks.get()); // ["Moby Dick", "The Firm"]

私はこれで行きました:

function Collection () {
    var stuff = [];
    this.get = function(){
        return stuff;
    };
    this.add = function(item){
        stuff.push(item);
    };
}
function Books () {
    Collection.call(this);
};

Books.prototype = new Collection();

Books.prototype.constructor = Books;

var myBooks = new Books();
myBooks.add("Moby Dick");

var yourBooks = new Books();
yourBooks.add("The Firm");

console.log(myBooks.get());
4

2 に答える 2

0

コードには多くの構造的な問題があります。Collection のメソッドもプロトタイプ化する必要がありますが、現在はそうではありません。「もの」へのアクセスを取得しようとするメソッドのプロトタイプを作成しないと、そのプロパティの独自のインスタンスを作成する代わりに、まったく同じプロパティを参照する複数の関数が作成されます。代わりに、次の構造に従ってください。

メインコレクションクラス

function Collection () {
    this.stuff = [];
};

Collection.prototype.get = function(){
    return this.stuff;
};

Collection.prototype.add = function(item){
    this.stuff.push(item);
}

コレクションからの主な書籍クラスの継承

function Books () {
    Collection.call(this);
};

Books.prototype = new Collection();
Books.prototype.constructor = Books;

Booksクラスの使用

var myBooks = new Books();
myBooks.add("Moby Dick");

var yourBooks = new Books();
yourBooks.add("The Firm");

console.log(yourBooks.get());

JSFiddle と実際の例:

JSFiddle

Javascript プロトタイプに関する詳細を入手できるソース:

Mozilla ドキュメント

コード自体またはこの構造の変更について質問がある場合は、次のようにお知らせください。

于 2013-10-08T19:56:03.867 に答える