以下是我的尝试过程
First
function Parent() {
this.count = 1;
this.addCount = function() {
console.log(++this.count);
};
this.items = [];
this.addItem = function(item) {
this.items.push(item);
console.log(this.items);
};
}
function Child() {
}
Child.prototype = new Parent();
var child1 = new Child();
var child2 = new Child();
child1.addCount(); // 2
child2.addCount(); // 2
child1.addItem('child1'); // child1
child2.addItem('child2'); // child1, child2
console.log(child1);
/*
count: 2
__proto__: Parent
count: 1
items: ['child1', 'child2']
addCount: function
addItem: function
*/
Result
发现有个问题,引用属性共享了
Try agian
// 忽略未修改的代码
function Child() {
Parent.call(this); // 显示调用父类的构造函数
}
console.log(child1);
/*
count: 2
items: ['child1']
addCount: function
addItem: function
__proto__: Parent
count: 1
items: []
addCount: function
addItem: function
*/
Result
重复定义了addCount和addItem方法
Try again
// 忽略未修改的代码
function Parent() {
this.count = 1;
this.items = [];
}
Parent.prototype.addCount = function() {
console.log(++this.count);
};
Parent.prototype.addItem = function(item) {
this.items.push(item);
console.log(this.items);
};
console.log(child1);
/*
count: 2
items: ['child1']
__proto__: Parent
count: 1
items: []
addCount: function
addItem: function
*/
Result
从结果上看简单实现了继承,但是有几个疑问:
- Object.create or new
- 如何实现非引用类型属性的共享
- 显式调用父类的构造函数感觉很繁琐,看能不能去掉
- 多重继承?
大家是怎么使用原型链实现继承的呢?
--------------- 2018/1/18 13:45 ------------------------
看了@Maxiye提供的文章,也许可以使用简单的混合实现,类似于php的trait,针对某些情况可能比较适用
// 去掉原型链关联
// Child.prototype = new Parent();
function Child() {
Parent.call(this);
}
推荐看看这篇文章:彻底弄懂JS继承