在下面的代码中,我有两本书籍集。一个系列有“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());
答案 0 :(得分:6)
使用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"]
答案 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与工作示例:
您可以从中获取有关Javascript原型的更多详细信息:
如果您对代码本身或结构的这种变化有任何疑问,请告诉我。