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

How do I get each instance to inherit their own instance of a member?

本文关键字:实例 继承 自己的 成员      更新时间:2023-09-26

在下面的代码中,我有两个书集。一个系列有"白鲸",而另一个系列有"公司"。然而,当我看第二个系列时,它也有白鲸。如何创建不共享相同数据的图书?

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());

将每个实例的值与 this 一起使用:

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

然后在集合中:

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

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


完整代码:

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"]

你的代码有很多结构问题。集合中的方法也应该已原型化,而它们目前尚未原型化。如果你不对试图访问"stuff"的方法进行原型设计,你最终会得到多个引用完全相同属性的函数,而不是创建自己的该属性实例。请改为遵循以下结构:

集合

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

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