JavaScript — 继承

继承

继承是指一个对象直接使用另外一个对象的属性和方法
两个继承方式: 接口继承、实现继承
ECMAScript只支持实现继承,而实现继承主要依靠原型链来实现的。

1、class类继承(ES6)

User类:
	class User {
		constructor(username, password) {
			this.username = username;
			this.password = password;
		}
		age=19
		login() {
			console.log('登陆')
		}
	}
给User原型对象上追加name属性
	User.prototype.name = ‘西西’
	
Admin类:
	class Admin extends User {
		work='IT'
		deletePerson() {
			console.log('删除')
		}
	}	
给Admin原型对象上追加address属性
	Admin.prototype.address = ‘厦门’	
	
new Admin类返回实例对象admin
	let admin = new Admin('admin',123456)

在自己的原型对象上找
	admin.deletePerson()   // '删除'

先在自己的原型对象上找,没有再去继承的User原型对象上找
	admin.login()   // '登录'  

因为Admin类是继承User类,所以Admin类就和直接在该类定义属性是一样的,所以可以直接就用
	console.log(admin.username, admin.password,adim.age)   // 'admin' 123456 19

因为Admin类是继承User类,User的没有name属性,就去Admin原型属性里找
	console.log(admin.name,admin.address)  //西西


2、原型链继承(ES5)

function User(username, password) {
	this.username = username;
	this.password = password;
	this.lgoin = function() {
		console.log('登陆')
	}
}

function Admin() {
	this.deletePerson = function() {
		console.log('删除')
	}
}

Obejct原型是系统默认的,所有的引用类型都可以调用Object原型上的方法
	Object.prototype.login = function() {
		console.log('Object原型上的login的方法')   // 指向Obejct原型是系统默认的,所有的对象上面都是Object的prototype
	}
	
	Admin.prototype = new User('admin', 1234567)
	let admin = new Admin()
	
	admin.login()   // 登陆
	admin.deletePerson ()   // 删除
	console.log(admin.username, admin.password) // admin  1234567

//  先在Admin方法上找,没有再去继承的User方法找,再没有就去Object的方法找,最终找不到就报错

不管是数组,日期对象,对象,它们的原型都指向Object的prototype
	let arr = [1,2,3]
	arr.login() //  '登陆'

继承方法

(1)第一种是以原型链的方式来实现继承,但是这种实现方式存在的缺点是,在包含有引用类型的数据时,会被所有的实例对象所共享,容易造成修改的混乱。还有就是在创建子类型的时候不能向超类型传递参数。
(2)第二种方式是使用借用构造函数的方式,这种方式是通过在子类型的函数中调用超类型的构造函数来实现的,这一种方法解决了不能向超类型传递参数的缺点,但是它存在的一个问题就是无法实现函数方法的复用,并且超类型原型定义的方法子类型也没有办法访问到。
(3)第三种方式是组合继承,组合继承是将原型链和借用构造函数组合起来使用的一种方式。通过借用构造函数的方式来实现类型的属性的继承,通过将子类型的原型设置为超类型的实例来实现方法的继承。这种方式解决了上面的两种模式单独使用时的问题,但是由于我们是以超类型的实例来作为子类型的原型,所以调用了两次超类的构造函数,造成了子类型的原型中多了很多不必要的属性。
(4)第四种方式是原型式继承,原型式继承的主要思路就是基于已有的对象来创建新的对象,实现的原理是,向函数中传入一个对象,然后返回一个以这个对象为原型的对象。这种继承的思路主要不是为了实现创造一种新的类型,只是对某个对象实现一种简单继承,ES5 中定义的 Object.create() 方法就是原型式继承的实现。缺点与原型链方式相同。
(5)第五种方式是寄生式继承,寄生式继承的思路是创建一个用于封装继承过程的函数,通过传入一个对象,然后复制一个对象的副本,然后对象进行扩展,最后返回这个对象。这个扩展的过程就可以理解是一种继承。这种继承的优点就是对一个简单对象实现继承,如果这个对象不是我们的自定义类型时。缺点是没有办法实现函数的复用。
(6)第六种方式是寄生式组合继承,组合继承的缺点就是使用超类型的实例做为子类型的原型,导致添加了不必要的原型属性。寄生式组合继承的方式是使用超类型的原型的副本来作为子类型的原型,这样就避免了创建不必要的属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值