2 回答

TA贡献1条经验 获得超0个赞

TA贡献1770条经验 获得超3个赞
1:首先,为什么这个的constructer要指向subType?
实例化一个对象的时候,会产生一个指针属性:_protol_,指向实例的原型对象。我们的原型对象内会产生constructor属性,指向它的构造函数。
我们的实例能从原型对象上继承属性与方法。同时,我们原型对象内的constructor属性自然也能够继承到。
现在来看问题中的例子:
if(typeof(AbstractFac[superType]) == 'function'){ function F(){} F.prototype = new AbstractFac[superType](); console.log(subType); console.log(subType.constructor); }else{ throw new Error('null'); }
在重新指定constructor和进行继承前来看看 传入的subType 和 它的构造函数是什么:
function(price,speed){ this.price = price; this.speed = speed; }function Function() { [native code] }
即我们下面传入子类的构造函数,此时的子类还没有实例化,所以它还并没有从其原型对象上获取到constructor属性。
此时,
subType : 我们定义的子类函数
subType.constructor(即一个函数的构造函数): 当然就是我们的Function对象了!
那么我们的抽象工厂为了创建出这个子类实例,需要做什么呢?
也就是例子中写的啦:
subType.constructor = subType; subType.prototype = new F();
这样一来,我们定义的未实例化的子类函数,通过这个抽象工厂,进行了实例化;通过subType.constructor = subType得到了本身应该有的constructror属性,通过原型继承到了父类的属性和方法。
2:为什么要弄个F函数来缓存?
因为数组,对象,函数(方法),作为引用类型,它们的名称只是指向堆内存的指针。如果直接subType.prototype = new AbstractFactory[superType]();那么我们可以通过子类去修改堆内存中的内容。进而改变父类的引用类型的值了。
缓存的话,能够 阻止我们的子类对父类可能发生的更改。
添加回答
举报