如何让每个实例继承自己的成员实例?

时间:2013-10-08 19:17:15

标签: javascript prototypal-inheritance

在下面的代码中,我有两本书籍集。一个系列有“Moby Dick”,而另一个系列有“The Firm”。然而,当我看第二个系列时,它也有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());

2 个答案:

答案 0 :(得分:6)

使用this的每个实例值:

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

然后在集合中:

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

目前,在设置图书原型时,只会创建一个stuff数组。然后,所有继承的getter和setter都引用那个变量。


Complete code

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

Books.prototype = new Collection ();

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

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

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

答案 1 :(得分: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;

使用图书

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

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

console.log(yourBooks.get());

JSFiddle与工作示例:

JSFiddle

您可以从中获取有关Javascript原型的更多详细信息:

Mozilla Docs

如果您对代码本身或结构的这种变化有任何疑问,请告诉我。