JS继承的理解

原型链式继承

function Person(name){   // 父对象
	this.name1 = "person";
	this.name2 = name;
}
Person.prototype.getName = function(){
	return this.name1;
}

function Young(age){   //子对象
	this.age = age;
}
Young.prototype = new Person();
let young = new Young(22);

控制台测试打印结果
原型链式继承

将父类的实例作为子类的原型,这样子类就可以通过原型链得到父类构造函数中的实例属性以及父类原型中的方法和属性。父构造函数被调用了两次。
缺点:在子类实例创建之前创建了父类的实例,无法向父类传递参数。
父类的属性和方法被所有子类共用,父类方法或属性改变时,所有子类继承的方法和属性都会随之改变。

构造函数式继承

function Person(name){
	this.name = name;
}
Person.prototype.getName = function(){
	return this.name;
}

function Young(name,age){
	this.age = age;
	Person.call(this,name);
}
let young = new Young("Lucy",22);

控制台测试打印结果
构造函数式继承
通过在子类中调用父类来继承父类构造方法中的属性。
缺点:不能继承父类原型上的属性和方法。

组合继承

function Person(name){
	this.name = name;
}
Person.prototype.getName = function(){
	return this.name;
}

function Young(name){
	Person.call(this,name);
	this.age = 22;
}
Young.prototype = new Person();
let young = new Young("Lucy");
Young.prototype.constructor = Young;//改变构造器指向

组合式继承
组合式继承利用了上面两种方式的优点,实现了既可以实现向父类传参,又可以通过原型链继承父类原型上的方法和属性。
缺点:子类共享父类原型的属性和方法。

原型式继承

function Person(){
	this.name = "person";
}
Person.prototype.getName = function(){
		return this.name;
}
function Young(){
	this.age = 22;
}

function create(obj){
	function F(){};
	F.prototype = obj.prototype;
	return new F();
}
Young.prototype = create(Person);
let young = new Young();

在直接继承的基础上,增加了一个中间空对象,这使在修改子对象的原型对象时,不会影响到父对象的原型对象。
ES5的Object.create()拥有与上面create()类似的效果。Object.create(proto,propertites)

寄生组合式继承

function Person(name){
	this.name = name;
}
Person.prototype.getName = function(){
	return this.name;
}
function Young(name,age){
	Person.call(this,name);
	this.age = age;
}
function createPerson(superType,subType){
	var o = Object.create(superType.prototype);
	o.constructor = subType;
	subType.prototype = o;
}
createPerson(Person,Young);
let young = new Young("Lily",22);

寄生组合式继承
通过借用构造函数来继承属性,通过原型链来继承方法。创建一个父类的副本,子类原型对象修改时,不会影响父类原型对象。
ps:

  • 每new一个对象时,就会创建一次构造函数中的方法,这样多个实例对象就会创建多个方法,占用内存。没有提高代码的复用性。所以可以把方法都放在原型对象上。
  • 当给通过原型链方式继承时,使用Young.prototype = Person.prototype,若改变子类原型,会直接改变父类原型,而通过创建对象赋值给子类原型时,不会改变父类原型,只是会调用两次父构造方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值