史上最为详细的javascript继承(推荐)(2)

定义两个构造函数,分别为父类(SuperType)、子类(SubType),为了实现子类能够使用父类的属性(本身和原型上面的属性)。重写子类的原型,让子类的原型指向父类实例,这样子类的构造函数就是父类的实例地址,实现子类可以使用父类的本身和原型上的属性
不要把父类当中构造函数,当中一个函数来处理这样更容易理解,在子类的构造函数中借用父类函数通过修改this来执行,这样子类的实例包含父类的属性

优点

解决了原型链继承引用类型的实例操作导致引用改变

解决了借构造函数继承方式的,父类原型子类实例可以使用

缺点

父类的构造函数被实例换了两次

实例会有父类的构造函数的一些this属性、子类的构造函数(prototype)上也有一份实例的上有的属性

原型式继承

话说上面的的组合继承不是已经被开发者认可了吗,原型式继承是啥?下面咱们看看原型式继承是什么样的。

代码实现:

1 function object(o){ function F(){}; F.prototype=o; return new F() } var person = { name: "Nicholas", friends: ["Shelby", "Court", "Van"] }; var personShiny = object(person); var personRed = object(person); console.log(personShiny.name)//Nicholas console.log(personRed.name)//Nicholas personShiny.friends.push('red'); personRed.friends.push('shiny'); console.log(personShiny.friends)//["Shelby", "Court", "Van","red","shiny"] //ECMAScript 5 通过新增 Object.create()方法规范化了原型式继承。这个方法接收两个参数:一 //个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象。在传入一个参数的情况下, //Object.create()与 object()方法的行为相同。 2 var person = { name: "Nicholas", friends: ["Shelby", "Court", "Van"] }; var personShiny = Object.create(person); var personRed = Object.create(person); console.log(personShiny.name)//Nicholas console.log(personRed.name)//Nicholas personShiny.friends.push('red'); personRed.friends.push('shiny'); console.log(personShiny.friends)//["Shelby", "Court", "Van","red","shiny"]

基本原理

通过Object.create()方法来创建一个有基础类的实例,这实例的__proto__指向基础类

使用场景

在不使用构造函数的情况下,只想让一个对象与另一个对象保持类似的情况下

语言实现

需要创建一个基础对象,作为一个新对象的基础对象,通过object方法或者Object.create方法处理得到一个新实例,这个新实例上的__proto__指向基础对象

优点

再不用创建构造函数的情况下,实现了原型链继承,代码量减少一部分

缺点

一些引用数据操作的时候会出问题,两个实例会公用继承实例的引用数据类

谨慎定义方法,以免定义方法也继承对象原型的方法重名

无法直接给父级构造函数使用参数

寄生继承

咱们看了上面的原型式继承,其实就是和原型链继承差别不大,只是省去了构造函数这一部,但是原型式继承也是有缺点的(不能够给备份的对象添加属性),下面寄生继承来解决。

代码实现:

// 和工厂模式非常类似,创建一个对象,增强一些功能并返回该对象 function createAnother(o){ var clone = Object(o); clone.sayHi=function(){ console.log('hi') } return clone } var person = { name:'shiny', friends:['a','b'] } var personShiny = createAnother(person); console.log(personShiny.sayHi())//Ho

基本原理

备份一个对象,然后给备份的对象进行属性添加,并返回

使用场景

在考不使用构造函数的情况下实现继承,前面示
范继承模式时使用的 object()函数不是必需的;任何能够返回新对象的函数都适用于此模式

语言实现

类似构造函数,通过一个执行方法,里面创建一个对象,为该对象添加属性和方法,然后返回

优点

再不用创建构造函数的情况下,实现了原型链继承,代码量减少一部分

可以给备份的对象添加一些属性

缺点

类似构造函数一样,创建寄生的方法需要在clone对象上面添加一些想要的属性,这些属性是放在clone上面的一些私有的属性

寄生组合继承

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/3eff3a31242aad5a8364bfe4a0337774.html