You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functioncustomerInheritCreate(Child,Father){varproto=Object.create(Father.prototype)// 通过 Father 实例创建 Father 原型实例对象proto.constructor=Child// 把 proto 的构造函数指向 ChildChild.prototype=proto// Child 原型链指向 proto 实例}functionFather(name){this.name=namethis.colors=["red","blue","green"]}Father.prototype.sayName=function(){console.log(this.name)}functionChild(name,age){Father.call(this,name)this.age=age}customerInheritCreate(Father,Child)// 构建原型链, ES6 extends不合适使用Child.prototype.sayAge=function(){console.log(this.age)}
The text was updated successfully, but these errors were encountered:
继承是 OO 思想中的重大特性,当然 JavaScript 也实现了这一特性,OO 语言当中都支持两种继承的方法:
ECMAScript 继承和 JAVA OO 语言那些不一样,只支持实现继承,不支持抽象的接口继承。
而在 ES5 中实现继承都是基于原型链来实现继承的,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。先回一下 JavaScript 原型链概念,每个构造函数都有一个原型的对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。如果我们让原型对象等于另一个类型的实例就形成了原型链。
1. 原型链继承
看一下实现继承的基本方式 (ES5)
(ES6) 继承的实现, ES6 有关键字
extends
定义继承需然,最终使用的还是通过原型链来实现,但是有了语法糖可看性良好了很多。2. 借用构造函数
使用借用构造函数其实就是,在子类型构造函数的内部调用父类型构造函数。甚至可以在子类给父类传参,用来实现构造函数不会重写子类型的属性。但是借用构造函数并没有继承至父类,调用不了父类的方法,所以只能使用下面组合继承的方式。
(ES5)
在 (ES6) 中借用借用父类的构造函数都是使用关键字
super
来实现的。3. 组合继承
组合继承是指原型链和借用构造函数的方式结合在一起。
组合继承 (ES5)
组合继承 (ES6) 等同于上面 ES5 的写法,而且更简洁易懂。
4. 原型式继承
原型式继承又称道格拉斯继承,其实就是
Object.create()
方法的实现。通过实例对象的原型来创建新的对象实例。原型式继承是通过原生方法实现的,所以 ES6 暂时没有语法糖支持。不过使用
Object.create()
传参会相对复杂一些。5.寄生式继承
寄生式继承是通过原型式继承,添加自己宝的属性或者函数。
6.寄生组合式继承
基本原理是通过通过
Object.create()
来实现父类的实例对象,再将子类型的原型继承父类的实例对象。这样创建的原型链,只会调用一次父类构造函数,并且避免在子类上面创建不性格多余的属性。The text was updated successfully, but these errors were encountered: