继承:指在一个对象的基础上建立新对象的过程,原型指在这过程当中做为基础的对象。javascript
var o = {
f:function(){
return this.a+this.b;
}
}
var p = Object.create(o);
p.a=1;
p.b=2;
console.log(p.f());//3
复制代码
经过Object.create()方法咱们传入了o对象,做为p对象的原型来建立p对象,而后p对象中就产生了一个叫_proto_的指针,这指针指向o对象。经过这个指针p对象就能够访问到o对象的f方法。java
###2.prototype对象markdown
function dog(name){
this.name=name;
return this.name;
}
var dogA = new dog('dogA');
console.log(dogA);//dog{name:'dogA'}
复制代码
使用new对象会生成一个dog对象的实例,缺点:没法共享属性和方法.好比说:函数
function dog(name){
this.name=name;
this.species='犬科';
return this;
}
var dogA = new dog('AA');
var dogB = new dog('BB');
dogA.species = '猫科';
console.log(dogA);//dog {name: "AA", species: "猫科"}
console.log(dogB);//dog {name: "BB", species: "犬科"}
复制代码
改变了dogA的species,不会影响dogB中的species.每个实例对象,都有本身的属性和方法的副本。这不只没法作到数据共享,也是极大的资源浪费。this
这个属性包含一个对象,全部实例对象须要共享的属性和方法,都放在这个对象里面;哪些不须要共享的属性和方法, 就放在构造函数里面。实例一旦建立,将自动引入prototype对象的属性和方法,也就是说,实例对象的属性和方法,分为两种,一种是本地的,另外一种是引用的。spa
function dog(name){
this.name=name;
return this;
}
dog.prototype = {species:'犬科'};
var dogA = new dog('AA');
var dogB = new dog('BB');
console.log(dogA.species);//犬科
console.log(dogB.species);//犬科
复制代码
如今,species属性是放在prototype对象中,是两个实例对象共享的。只要修改了prototype,就会同时影响到两个实例对象。prototype
dog.prototype.species = '猫科';
console.log(dogA.species);//猫科
console.log(dogB.species);//猫科
复制代码
讲原型一个不可避免的概念就是原型链,原型链是经过前面两种建立原型Object.create()或dog.prototype的方式生成的一个_prtoto_指针来实现的。指针
function foo(){
foo.prototype.z=3;
}
var obj = new foo();
obj.x = 1;
obj.y = 2;
console.log(obj);//foo {x: 1, y: 2}
console.log(obj.z);//3
复制代码
对象obj上是没有z的,可是他的原型链上有z,因此查找的时候若是对象自己不存在的话就会沿着原型链往上查找code
obj.z=5;
console.log(obj.z);//5
console.log(foo.prototype.z);//3
复制代码
若是对象上有的话则不会向原型链上查找,并且并不会改变原型链上的值orm