我想问的是为什么es5修改了父类的属性,但是依然es6返回值还是true呢???
要实现继承,就必须保证实例对象的修改不能影响被继承者自身。
new 过程,实际上就是创建一个新对象的过程。所以不管你之后var 的es5还是es6,实际上都是创建了2个新的实例对象。
你修改es5的flag 并不会影响到es6的flag
要想修改父类的属性,可以这么写
var es5 = Sub // 将es5的引用指向Sub
es5.flag = false // 修改es5的flag 实际上修改的是 es5和Sub 的同一引用
var es6 = new Sub()
console.log(es6.flag) // false
我自己研究了下,发现es5.flag 相当于添加,没有改变父类的属性,那么怎么修改父类属性呢,我想重现下
这个很简单 在《javascript高级程序(第三版)》中有提到这一点
Sub是构造函数,在new一个实例对象时,再为其添加属性,即你自己声明的es5,(在这里提一点,实例对象属性或者方法的搜索顺序一般是,先搜索Sub构造函数,然后是在Sub的原型上搜索)但是这里
这里实例对象本身的属性flag已经被赋值为false,这时构造函数上,还是构造函数的原型上的flag属性都将会被屏蔽掉,注意这里是屏蔽,而不是替换
因此在声明一个es6实例对象时,它的flag属性是通过我在上面说的搜索方法搜索的