继承(原型链是实现继承的主要方法)
通过new关键字实现的
当A要继承Q时
A.prototype=new Q();//ok
分析一下 new Q()==》建立一个对象,没有名字
A.prototype本来就是一个对象 重新赋值(原来的原型就没有了)
等价于对象1赋值给对象2而已了 ,就这样,相当于对象2的原型就是对象1的一个实例
当然就有对象1的所有属性的方法了
从而A(Q的对象,A的原型)还有了一个指针指向Q的原型
A.prototype.__proto__==Q.prototye
记住有一点,所有引用类型默认都继承了Object(这里引用类型指的是A的原型)
确定原型和实例的关系
(实例 instranceof 原型)//使用方式(原型链上出现过的构造函数就返回true)
另外 一种方法isPrototype 例如:Object.prototype.is///
这样的优势
1.可以像超类传参数
2.问题,方法都在构造函数内部(无法复用)
组合继承
继承的构造方法内//继承属性
{ father.call(this); }
继承的构造方法外
son.prototype=new father();//集成方法,因为父亲的方法写在原型上
这个应该是标准继承(缺点,调用了2次超类构造方法,下面有更好的继承方法)
原型式继承
fun object(o){
function F(){};
F.prototype=o;//这里搞到了父亲方法的引用,(就是父亲方法),也是缺点(共享了)
return new F();//这里相当于new了一个父亲的对象出去
}
es5新增了Object.create()方法规范了这种继承(2个参数)
1个用作新对象原型的对象和(可选)一个为新对象定义额外属性的对象
传一个参数于object函数相同
var son=Object.create(father, {name: { value:"liu" }});//集成方式
寄生方式继承
寄生组合继承//最最最规范的方式
function inherit(son , father){
var prototype=object(father.prototye);//创建对象
prototype.constructor=son;//增强对象
son.prototype=prototype;//指定对象,完成继承
//感觉像是拼接这个原型 画图好理解,现有原型,在原型上把基础的
//constructor属性拼接好,再把完整的东西送出去
}
学完这章的完美继承案例附带注释
function object(obj){
var F=function(){};
F.prototype=obj;
return new F(); //返回一个空函数,空函数有传入的对象
}
//这个例子这里就是获取一个带父亲原型的空函数
function inherit(son , father){
var prototype=object(father.prototype);//对象有了父亲的原型
prototype.constructor=son;//想继承的son有了父亲的原型并且把指针指向自己
son.prototype=prototype;//继承结束,把这个包含父亲东西的原型重写son的原型
}
//完善上面的那个object
function Father(){
this.name="lu";
}
Father.prototype.getName=function(){
return this.name;
};
function Son(){
Father.call(this);
};
inherit(Son,Father);//这里继承了
var temp=new Son();
alert(temp.getName());//打印出Lu
他们之间的关系
alert(temp.constructor.prototype.__proto__==Father.prototype);//true
通过new关键字实现的
当A要继承Q时
A.prototype=new Q();//ok
分析一下 new Q()==》建立一个对象,没有名字
A.prototype本来就是一个对象 重新赋值(原来的原型就没有了)
等价于对象1赋值给对象2而已了 ,就这样,相当于对象2的原型就是对象1的一个实例
当然就有对象1的所有属性的方法了
从而A(Q的对象,A的原型)还有了一个指针指向Q的原型
A.prototype.__proto__==Q.prototye
记住有一点,所有引用类型默认都继承了Object(这里引用类型指的是A的原型)
确定原型和实例的关系
(实例 instranceof 原型)//使用方式(原型链上出现过的构造函数就返回true)
另外 一种方法isPrototype 例如:Object.prototype.is///
原型链上实现继承时,不能使用对象字面量创建原型方法(这样会重写原型链)
借用构造函数(解决引用类型带来的问题,(同样是一个方法的实例,修改A的属性导致B的属性改变了))
这样的优势
1.可以像超类传参数
2.问题,方法都在构造函数内部(无法复用)
组合继承
继承的构造方法内//继承属性
{ father.call(this); }
继承的构造方法外
son.prototype=new father();//集成方法,因为父亲的方法写在原型上
这个应该是标准继承(缺点,调用了2次超类构造方法,下面有更好的继承方法)
原型式继承
fun object(o){
function F(){};
F.prototype=o;//这里搞到了父亲方法的引用,(就是父亲方法),也是缺点(共享了)
return new F();//这里相当于new了一个父亲的对象出去
}
es5新增了Object.create()方法规范了这种继承(2个参数)
1个用作新对象原型的对象和(可选)一个为新对象定义额外属性的对象
传一个参数于object函数相同
var son=Object.create(father, {name: { value:"liu" }});//集成方式
寄生方式继承
寄生组合继承//最最最规范的方式
function inherit(son , father){
var prototype=object(father.prototye);//创建对象
prototype.constructor=son;//增强对象
son.prototype=prototype;//指定对象,完成继承
//感觉像是拼接这个原型 画图好理解,现有原型,在原型上把基础的
//constructor属性拼接好,再把完整的东西送出去
}
学完这章的完美继承案例附带注释
function object(obj){
var F=function(){};
F.prototype=obj;
return new F(); //返回一个空函数,空函数有传入的对象
}
//这个例子这里就是获取一个带父亲原型的空函数
function inherit(son , father){
var prototype=object(father.prototype);//对象有了父亲的原型
prototype.constructor=son;//想继承的son有了父亲的原型并且把指针指向自己
son.prototype=prototype;//继承结束,把这个包含父亲东西的原型重写son的原型
}
//完善上面的那个object
function Father(){
this.name="lu";
}
Father.prototype.getName=function(){
return this.name;
};
function Son(){
Father.call(this);
};
inherit(Son,Father);//这里继承了
var temp=new Son();
alert(temp.getName());//打印出Lu
他们之间的关系
alert(temp.constructor.prototype.__proto__==Father.prototype);//true