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
functionCar(){}Car.prototype.orderOneLikeThis=function(){// Clone producing functionreturnnewthis.constructor();}Car.prototype.advertise=function(){console.log("I am a generic car.");}functionBMW(){}BMW.prototype=Object.create(Car.prototype);BMW.prototype.constructor=BMW;// Resetting the constructor propertyBMW.prototype.advertise=function(){console.log("I am BMW with lots of uber features.");}varx5=newBMW();varmyNewToy=x5.orderOneLikeThis();myNewToy.advertise();// => "I am BMW ..." if `BMW.prototype.constructor = BMW;` is not // commented; "I am a generic car." otherwise.
直接进入主题:
继承的操作需要有一个父类,这里使用构造函数外加原型来创建一个:
原型链继承
关键点:子类原型等于父类的实例
Child.prototype = new Person()
原型链的详细讲解自己之前有一篇文章说到深入理解原型对象和原型链
特点:
注意事项:
借用构造函数
关键点:用
call
或apply
将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制))Person.call(this, 'reng')
针对
call, apply, bind
的使用,之前有篇文章谈谈JavaScript中的call、apply和bind提到。特点:
注意事项:
组合继承
组合继承是
原型链继承和借用构造函数继承
的组合。关键点:结合了两种模式的优点--向父类传参(call)和复用(prototype)
特点:
注意事项:
原型式继承
关键点:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了可以随意增添属性的实例或对象。
Object.create()
就是这个原理。特点:
注意事项:
**Object.create()方法规范了原型式继承。**这个方法接收两个参数,一个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象。
寄生式继承
关键点:就是给原型式继承外面套个壳子。
特点:
注意事项:
寄生组合继承
它跟组合继承一样,都比较常用。
寄生:在函数内返回对象然后调用
组合:
重点:修复了组合继承的问题
在上面的问题中,你可能发现了这么一个注释
obj.constructor = Sub; // 一定要修复实例
。为什么要修正子类的构造函数的指向呢?因为在不修正这个指向的时候,在获取构造函数返回的时候,在调用同名属性或方法取值上可能造成混乱。比如下面:
参考 & 后话
更多的内容,请移步我的博客,能给个赞就更好了😄
The text was updated successfully, but these errors were encountered: