原型链继承的优缺点?
-
在OO语言中,继承方式通常有两种接口继承和实现继承。
在JavaScript中无法实现接口继承(由于函数没有签名),只支持实现继承(通常依靠原型链来实现继承)。 -
原型链实现继承的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
原型链的缺点?
- 在通过原型链实现继承时,原型实际上会成为另一个类型的实例。所以父类的实例属性实际上会成为子类的原型属性。结果就是所有的子类的实例都会共享父类的实例属性(引用类型的)。
- 在创建子类型的实例时,没有办法在不影响所有实例的情况下,向父类型的构造函数传递参数。
原型链的优点?
- 由以上可知,通过原型链继承的方式,原先存在父类型的实例中的所有属性和方法,现在也能存在于子类型的原型中了。
实现原型链继承
必须基于一个已有对象来实现,即必须有一个对象可以作为另一个对象的基础。
function Animal(o) {
function F(){};
F.prototype = o;
return new F();
}
let dog = {
name: 'origin',
type: 'shiba',
friends: ['KUN', 'Kris'],
intr: function() {
console.log(`${this.name}的朋友有:${this.friends}`);
},
}
let otherDog = Animal(dog);
otherDog.name = '小白';
otherDog.friends.push('小新');
otherDog.intr(); // 小白的朋友有:KUN,Kris,小新
let anotherDog = Animal(dog);
anotherDog.name = '小智';
anotherDog.friends.push('皮卡丘');
anotherDog.intr(); // 小智的朋友有:KUN,Kris,小新,皮卡丘
otherDog.intr(); // 小白的朋友有:KUN,Kris,小新,皮卡丘
dog.intr(); // origin的朋友有:KUN,Kris,小新,皮卡丘
//dog的friends不仅属于dog自己所有,而且也会被otherDog 和 anotherDog 共享。
在没有必要兴师动众地创建构造函数,而只想让一个对象与另一个对象保持类似的情况,原型链继承是完全可以胜任的,不过要记得包含引用值的属性始终都会共享相应的值(就像上面的 friends
和 intr
)。
网友评论