继承发展史
-
传统模式 --> 原型链
过多的继承了没用的属性
-
借用构造函数
不能继承借用的构造函数的原型
每次构造函数都要多走一个函数
-
共享原型
不能随便改动自己的原型
function Father() { } function Son() { } function inherit(Target, Origin) { Target.prototype = Origin.prototype; } inherit(Son, Father);如果想要给son加一个属性
Son.prototype.sex = "male",这样会使本没有这个属性的father也增加了这个属性,因为它们的prototype指向是相同的。 -
圣杯模式
中间加入一个对象,起到了隔离的作用,今后为Son.prototype添加属性时,全部都会加在这个对象里面,不会对父级产生影响。而向上查找是沿着__proto__查找,可以顺利查找到父级的属性,实现继承。
function Father() { } function Son() { } function inherit(Target, Origin) { function F() {}; F.prototype = Origin.prototype; Target.prototype = new F(); Target.prototype.constuctor = Target; //son.constuctor会指向Father,利用这一步将son.constuctor归位 Target.prototype.uber = Origin.prototype; //通过这个方法可以去找对象真正继承自谁 } inherit(Son, Father); var son = new Son(); var father = new Father();另一种写法,将变量F私有化(建议用这种写法)
var inherit = (function () { var F = function() {}; return function (Target,Origin) { F.prototype = Origin.prototype; Target.prototype = new F(); Target.prototype.constuctor = Target; Target.prototype.uber = Origin.prototype; } }());