在下面的代码中,我有两个图书集合。一个收藏集有“白鲸”,而另一个收藏集有“公司”。然而,当我看第二个收藏时,它也有“白鲸”。如何创建不共享相同数据的图书?
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());发布于 2013-10-09 03:21:05
对this使用每个实例的值
function Books () {
this.stuff = [];
}然后在集合中:
this.get = function () {
return this.stuff;
};当前,当您设置Books的原型时,只创建了一个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"]发布于 2013-10-09 03:56:04
你的代码有很多结构问题。你在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原型的更多详细信息的源代码:
如果你对代码本身或结构上的变化有任何疑问,请在下面告诉我。
https://stackoverflow.com/questions/19256386
复制相似问题