继承发展史:
1.传统形式 --> 原型链
过多的继承了没有用的属性
prototype
2.借用构造函数
不能继承借用构造函数的原型
每次构造函数都要多走一个函数
function Preson(){
//.....
}
function Student(){
Preson.call(this)
//.....
}
ver student = new Preson();
3.共享原型
不能随便改动自己的原型
Father.prototype.lastNme = 'Deng';
function Father(){}
function Son(){}
function inherit(Target , Origin){
Target.prototype = Origin.prototype;
}
inherit(Son , Father);
var son = new Son();-->一定是要先继承,然后再实例化.
但是如果Son.prototype.sex = 'man',因为Son和Father的prototype指向的是同一个地址,所以当Son修改引用的值的时候,Father的原型,在指向的同一个引用的值也被修改.
4.圣杯模式
Father.prototype.name = 'xx';
function Father(){}
function F(){}
F.prototype = Father.prototype;
Son.prototype = new F();
function Son(){}
//所以抽象成以下的功能
function inferit(Target , Origin){
function F(){}
F.prototype = Origin.prototype;
Target .prototype = new F();
//所以归类,就是指明constuctor
Target.prototype.constuctor = Target;
//指明超类,就是真正继承自谁
Target.prototype.uber = Origin.prototype;
}
Father.prototype.lastNme = 'Deng';
function Father(){}
function Son(){}
inherit(Son , Father);
var son = new Son();
var father = new Father();
Son.prototype.sex = 'man';
这时打印son.sex和father.sex会发现son有而fater没有
son.__proto__ --> new F() 而new F().__proto__ --> Father.prototype 所以son.constuctor = function Father(){},所以在上面的inherit函数里面注释的两行下面的代码,可以帮助我们理解对象到底来自于谁.
//YUI3雅虎的一个写法,利用闭包的第三个作用:实现属性私有化,达到了与上面相同的功能
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;
}
}())