RequireJS与Knockout实现继承时实例属性输出异常问题
问题原因
输出异常由两个错误共同导致:
- 父类构造函数调用未绑定当前实例上下文
Apple构造函数内的Fruit.call()没有传入第一个参数指定this指向,导致Fruit构造函数执行时没有为当前Apple实例创建专属的who方法和fruitTypeobservable属性。 - 所有
Apple实例共享原型链上的同一个fruitType属性
代码将Apple.prototype指向了一个单独的Fruit实例,当子类实例没有自己的fruitType属性时,所有读写操作都指向原型上这个唯一的observable值。第二次创建honey实例时赋值直接覆盖了原型上的属性,因此golden读取到的也是最新修改的值。
修复方案
修正Apple构造函数的父类调用逻辑,给Fruit.call传入当前实例的this:
function Apple(t){ // 传入当前实例作为父类构造函数的执行上下文 Fruit.call(this); this.fruitType(t); }
修正后每个Apple实例都会在构造阶段生成专属的fruitType observable,不再共享原型属性,输出就符合预期:
Golden Delicious Honeycrisp
内容的提问来源于stack exchange,提问作者GETah
相关产品推荐
相关产品推荐

