接上文:Object重识(一)
3. 对象继承
对象继承,我们不介绍名词,不说是什么样的继承,只从头看下每个继承方式的不足,并介绍如何补充
3.1 最简单的继承
function A (name) {
this.name = name
}
function B () {
}
B.prototype = new A('张三')
console.log(new B("李四").name) // 张三
此方法是将 B
的原型直接指向 A
的原型,从而达到继承的目的。Object.create
方式创建对象等同于此方式。
优势:
可达到属性复用。
缺陷:
无法在实例化的时候传递参数,不可配置。上述示例中 A
和 B
的名称都为 张三。即使我们在实例化 B
的时候传入一个名称。
3.2 改进版
改进版可在实例化的时候添加参数
function A (name) {
this.name = name;
}
function B (name) {
A.call(this, name)
}
console.log(new B('李四').name) // 李四
优势:
可实现定制化,支持传参配置
缺陷:
无法复用,所有内容都通过构造函数定义
3.3 结合版
function A (name) {
this.name = name;
}
A.prototype.address = '中国'
function B (name) {
A.call(this, name)
}
B.prototype = new A();
const b = new B('李四')
console.log(b.name) // 李四
console.log(b.address) // 中国
总结:
此继承方式也不是完整版,只是让大家了解继承的实现方式。像什么 寄生继承、寄生组合继承。咱们就多啰嗦了,容易越看越乱。有兴趣的读者可以之后再跟大家分享或者自行查阅。
3.4 ES6 继承
有了ES6
之后感觉空气都甜了。之前复杂的继承写法都变得特别简单。看栗子↓↓↓↓↓
class A {
constructor (name) {
this.name = name;
}
}
class B extends A {
constructor (name) {
super(name)
}
}
const b = new B('李四')
console.log(b.name)
class
方式创建对象注意点:
- 写在
构造函数constructor
中的方法都属于自身的方法。 - 写在
构造函数constructor
之外的方法都属于原型方法
举栗说明:
class A {
constructor () {
this.log = function