圣杯模式继承

331 阅读1分钟

继承发展史

  1. 传统模式 --> 原型链

    过多的继承了没用的属性

  2. 借用构造函数

    不能继承借用的构造函数的原型

    每次构造函数都要多走一个函数

  3. 共享原型

    不能随便改动自己的原型

    function Father() {
    }
    function Son() {
    }
    
    function inherit(Target, Origin) {
        Target.prototype = Origin.prototype;
    }
    inherit(Son, Father);
    

    如果想要给son加一个属性 Son.prototype.sex = "male",这样会使本没有这个属性的father也增加了这个属性,因为它们的prototype指向是相同的。

  4. 圣杯模式

    中间加入一个对象,起到了隔离的作用,今后为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;
    	}
    }());