问题
纯真的应用原型链持续,重要问题来自包含引用类型值的原型。
- function SuperType() {
- this.colors = ['red', 'blue', 'green']
- }
- function SubType() {
- }
- SubType.prototype = new SuperType()
- var instance1 = new SubType()
- var instance2 = new SubType()
- instance1.colors.push('black')
- console.log(instance1.colors) // ["red", "blue", "green", "black"]
- console.log(instance2.colors) // ["red", "blue", "green", "black"]
在SuperType构造函数定义了一个colors属性,当SubType经由过程原型链持续后,这个属性就会出现SubType.prototype中,就跟专门创建了SubType.prototype.colors一样,所以会导致SubType的所有实例都邑共享这个属性,所以instance1修改colors这个引用类型值,也会反竽暌钩到instance2中。
借用构造函数
此办法为懂得决原型中包含引用类型值所带来的问题。
这种办法的思惟就是在子类构造函数的内部调用父类构造函数,可以借助apply()和call()办法来改变对象的履行高低文
- function SuperType() {
- this.colors = ['red', 'blue', 'green']
- }
- function SubType() {
- // 持续SuperType
- SuperType.call(this)
- }
- var instance1 = new SubType()
- var instance2 = new SubType()
- instance1.colors.push('black')
- console.log(instance1.colors) // ["red", "blue", "green", "black"]
- console.log(instance2.colors) // ["red", "blue", "green"]
在给SubType原型添加办法的时刻,如不雅,父类上也有同样的名字,SubType将会覆盖这个办法,达到从新的目标。 然则这个办法依然存在于父类中。
结不雅,SubType的每个实例就会具有本身的colors属性的副本了。
推荐阅读
在本文中,我们将解释 Linux 体系中最关键的治理义务之一——关于体系 / CPU 的负载(load)和平均负载(Load average)的机能监控。起首来看所有的类 UNIX 体系中两个重要的表述:>>>详细阅读
本文标题:JavaScript六种继承方式
地址:http://www.17bianji.com/lsqh/35904.html
1/2 1