js中的对象中有一个prototype属性,这个就是函数中的原型,他的值也是一个对象,所以他也有自己的原型,这样连接起来就形成了原型链,原型链的顶端是object,它的prototype为null,如果自己设置了属性和函数,即任意一个对象都可以调用object原型上的函数和获取它的属性,前提是对象到object之间无同名属性和函数,再看下面代码
function Test(name){
this.name=name;
}
Test.prototype.out=function(){console.log(3)}
var obj=new Test('hh');
obj.out();
Object.prototype.con=function(){console.log(4)}
obj.con()
var a=new Array();
var b=[1,2]
b.con()
a.con()
结果为3,4,4,4。如果访问对象的属性,他会先从自己的身上找,找不到再从自己的原型上找,还找不到则会沿着原型链一层一层往上找。关于原型的继承也有几种方式
function Test(name){
this.name=name;
}
Test.prototype.out=function(){console.log(3)}
var obj=new Test('hh');
function Test1(age){
this.age=age;
}
Test1.prototype=obj;
var obj1=new Test1(10);
obj1.out()
第一种是父类new一个对象赋值给子类的原型,这个打印结果为3
function Test(name){
this.name=name;
}
Test.prototype.out=function(){console.log(3)}
var obj=new Test('hh');
function Test1(age){
this.age=age;
}
Test1.prototype=Test.prototype
var obj1=new Test1(10);
obj1.out()
Test1.prototype.in=function(){console.log(4)}
obj.in()
第二种是直接赋值父类的原型直接赋值给子类,但是这样做有缺点,就是子类的原型修改后会影响父类,所以输出的结果为3和4,及父类原型上也有in属性。
function Test(name){
this.name=name;
}
Test.prototype.out=function(){console.log(3)}
var obj=new Test('hh');
function Test1(age){
this.age=age;
}
for(var key in Test.prototype){
Test1.prototype[key]=Test.prototype[key]
}
var obj1=new Test1(10);
obj1.out()
第三种方法是使用for循环,这种方法也不会出现像第二种一样子类原型改变影响父类原型的情况。