JS中实现继承的六种⽅式及优缺点1、原型链继承
⾮常纯粹的继承关系,实例是⼦类的实例,也是⽗类的实例
⽗类新增原型⽅法/原型属性,⼦类都能访问到
优点:可以继承构造函数中的属性及⽅法也可以继承原型对象中的属性及⽅法
缺点:不能给⽗类的构造函数传参数
function Father(){
this.car="劳斯莱斯";
}
function Son(){
this.phone="⼩⽶Max";
}
Son.prototype=new Father();//通过原型链继承
var s=new Son();
console.log("------:",s.car,s.phone);
2、构造函数继承(对象冒充继承);
优点:可以给⽗类的构造函数传参
缺点:只能继承⽗类⾃⾝的属性和⽅法,原型对象上的不能继承
function Parent(age){
this.name="张三";
this.age=age;
}
function Child(age){
this.speak=function(){
console.log("听我说说" ,this);
}
Parent.call(this,age);//对象冒充
}
var d=new Child(25);
console.log("d:",d,d.name,d.age);
d.speak();
我们看到它解决了原型链继承的通病:
1.避免了引⽤类型的属性被所有实例共享。
2.可以在 Child 中向 Parent 传参。
3、组合继承原型继承+冒充继承
function Parent(age){
this.age=age;
this.name=["zhang","wang","li"];
}
js原型和原型链的理解Parent.prototype.run=function(){
console.log(this.name+" "+this.age);
}
function Child(age){
this.speak=function(){
console.log("我说说");
}
Parent.call(this,age);//对象冒充
}
Child.prototype=new Parent();//原型链继承
var d=new Child(100);
console.log("d:",d);
d.speak();
d.run();
4、原型式继承
创建的对象的原型=传⼊的对象
function createObj(o){
function Cat(){} //
Cat.prototype = o;//----- 创建的对象的原型=传⼊的对象
return new Cat();
}
var animal = {
name:"cat",
friend:["⼩⽩","⼩⿊"]
}
var a = createObj(animal);
console.log(a);
5、寄⽣式继承
function person (o) {
var clone = ate(o);
clone.sayName = function () {
console.log('hello world');
}
return clone;
}
var obj = {
name: '⼩⿊',
friends: ['A', 'B']
}
var p1 = person(obj)
console.log(p1)
//跟构造函数模式⼀样,每次创建对象都会创建⼀遍⽅法6、寄⽣组合式继承
function Parent(name) {
this.name = name;
}
Name = function() {
console.log(this.name);
}
function Child(name) {
Parent.call(this, name); // ⼦类拥有⽗类的属性和⽅法}
function createObj(o) {
function F() {} // 创建对象
F.prototype = o; // 创建对象的原型 = obj(传⼊的对象) return new F();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论