js的继承方法:JavaScript的继承方式
js的继承方法:JavaScript的继承方式在SuperType构造函数定义了一个colors属性,当SubType通过原型链继承后,这个属性就会出现SubType.prototype中,就跟专门创建了SubType.prototype.colors一样,所以会导致SubType的所有实例都会共享这个属性,所以instance1修改colors这个引用类型值,也会反映到instance2中单纯的使用原型链继承,主要问题来自包含引用类型值的原型。实现的本质是重写原型对象 代之以一个新类型的实例,那么存在SuperType的实例中的所有属性和方法,现在也存在于SubType.prototype中了我们知道,在创建一个实例的时候,实例对象中会有一个内部指针指向创建它的原型,进行关联起来,在这里代码 SubType.prototype = new SuperType() ,也会在SubType.prototype创建一个内部指针,将SubT
继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的!下面就来介绍下javascript存在的继承方式!
原型链:
原型链继承基本思想就是让一个原型对象指向另一个类型的实例。
代码定义了两个类型SuperType和SubType,每个类型分别有一个属性和一个方法,SubType继承了SuperType,而继承是通过创建SuperType的实例,并将该实例赋给SubType.prototype实现的
实现的本质是重写原型对象 代之以一个新类型的实例,那么存在SuperType的实例中的所有属性和方法,现在也存在于SubType.prototype中了
我们知道,在创建一个实例的时候,实例对象中会有一个内部指针指向创建它的原型,进行关联起来,在这里代码 SubType.prototype = new SuperType() ,也会在SubType.prototype创建一个内部指针,将SubType.prototype与SuperType关联起来
问题:
单纯的使用原型链继承,主要问题来自包含引用类型值的原型。
在SuperType构造函数定义了一个colors属性,当SubType通过原型链继承后,这个属性就会出现SubType.prototype中,就跟专门创建了SubType.prototype.colors一样,所以会导致SubType的所有实例都会共享这个属性,所以instance1修改colors这个引用类型值,也会反映到instance2中
借用构造函数:
此方法为了解决原型中包含引用类型值所带来的问题
这种方法的思想就是在子类构造函数的内部调用父类构造函数,可以借助apply()和call()方法来改变对象的执行上下文
在新建SubType实例是调用了SuperType构造函数,这样以来,就会在新SubType对象上执行SuperType函数中定义的所有对象初始化代码
结果,SubType的每个实例就会具有自己的colors属性的副本了
传递参数:
借助构造函数还有一个优势就是可以传递参数
组合继承(原型链 构造函数)
组合继承是将原型链继承和构造函数结合起来,从而发挥二者之长的一种模式
思路就是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性
这种模式避免了原型链和构造函数继承的缺陷,融合了他们的优点,是最常用的一种继承模式
原型式继承:
借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型
在object函数内部,先创建一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回这个临时类型的一个新实例
本质上来说,object对传入其中的对象执行了一次浅复制
这种模式要去你必须有一个对象作为另一个对象的基础
在这个例子中,person作为另一个对象的基础,把person传入object中,该函数就会返回一个新的对象
这个新对象将person作为原型,所以它的原型中就包含一个基本类型和一个引用类型
所以意味着如果还有另外一个对象关联了person,anotherPerson修改数组friends的时候,也会体现在这个对象中