2013-10-08 55 views
2

在下面的代码中,我有两个书籍集合。一个系列有“Moby Dick”,另一个系列有“The Firm”。但是,当我看第二集时,它也有莫比迪克。如何创建不共享相同数据的图书?如何让每个实例继承自己的成员实例?

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然后引用那个变量。


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

有没有办法让“东西”保密? – user2501337

+1

你可以通过使用var stuff = [];然而,如果你有资源这样做,东西只能在Collection中使用。检查我的答案,我还发布了一篇文章的链接,可以帮助您了解JavaScript中的OOP。 – charlitosJS

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

让我怒吼知道,如果你有关于任何问题编码本身或结构上的这种变化。