如何让每个实例继承其自己的成员实例
How do I get each instance to inherit their own instance of a member?
在下面的代码中,我有两个书集。一个系列有"白鲸",而另一个系列有"公司"。然而,当我看第二个系列时,它也有白鲸。如何创建不共享相同数据的图书?
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
如果您对代码本身或结构上的这种变化有任何疑问,请告诉我。
相关文章:
- 为什么函数对象的实例没有继承函数原型属性
- JavaScript继承:为什么从实例复制
- 使用Object.create作为原型的原型继承将[Object]作为实例的原型
- AngularJS:多个工厂实例任何原型继承
- 基于实例的 JavaScript 继承
- 从继承的实例创建 JavaScript 基类对象
- 通过构造函数属性和运算符实例设置继承
- 如何让每个实例继承其自己的成员实例
- 使用函数继承时相当于“实例”
- 在Javascript中使用寄生继承,是否可以实现内省实例方法
- 检查原型的继承,而不是实例
- 通过伪经典实例化(JavaScript)掌握原型继承
- 具有继承同一父级的类的sibings实例的主干继承模式
- 使用Object.keys获取用于创建构造函数实例的属性,然后打印继承的属性
- 在JavaScript中使用原型继承时,如何避免创建基类的实例
- 为什么实例没有't在没有prototype关键字的情况下继承添加到构造函数的属性
- 如何在JavaScript中进行继承,而不会在子类的所有实例之间共享父类的相同实例?
- Javascript继承静态和实例方法/属性
- javascript继承:实例vs原型
- 从javascript中的一个实例继承