原型:一个对象就是一个属性的集合,并且拥有一个独立的prototype原型对象,是以内部的[[prototype]]引用这的。
更加确切的说一个对象的原型就是它的构造函数prototype的值
所以的构造函数都有一个prototype值,在构造函数被创建之初就创建了,原型对象也是一个对象,默认就有一个里面有一个属性constructor指向构造函数,所以这也是对象为什么会有constructor属性的原型,我们来看一下代码
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.infor=function(){ console.log(this.name+this.age); } var p1=new Person("小明",14); p1.infor(); console.log(p1.__proto__==Person.prototype);//true console.log(Person.constructor);//Function console.log(p1.constructor);//Person
这里就引出一个方法Object.hasOwnProperty()用于检测是自己的属性还是从原型上继承来的
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.infor=function(){ console.log(this.name+this.age); } var p1=new Person("小明",14); console.log(p1.hasOwnProperty("name"));//true console.log(p1.hasOwnProperty("infor"));//false
每一个通过构造函数实例化的对象,都有具有原型的属性。所以当你的实例要找某个属性的时候会从自身开始寻找,若是没有就会到相应的原型中进行寻找。但是若是新对象想要定义一个自己没有的属性,且构造函数的原型中有的话,那么这个属性会被定义在自己的属性中不会影响其构造函数的原型
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.infor=function(){ console.log(this.name+this.age); } var p1=new Person("小明",14); //构建新属性 p1.number="2014";
//新方法 p1.num=function(){ console.log("this is my number:"+number); } console.log(p1.hasOwnProperty("number"));//true console.log(p1.hasOwnProperty("num"));//true
原型链:一个用来实现继承和共享属性的有限对象链。
由各级对象的__proto__属性逐级继承,形成的链式结构,就叫原型链。既然讲到原型链我们就会讲到继承,来看一下原型之间是如何继承的
1.设置两个对象之间的继承
子对象.__proto__=父对象,但是内置属性一般不能用。我们通过 Object.setPrototpyeOf(子对象和父对象)
2.继承原型
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.infor=function(){ console.log(this.name+this.age); } function Animal(name,age,color){ Person.apply(this,arguments); this.color=color; } Object.setPrototypeOf(Animal.prototype,Person.prototype); var n1=new Animal("豆豆",5,"black"); console.log(n1.hasOwnProperty("color"));//true console.log(n1.hasOwnProperty("name"));//true console.log(n1.name);//豆豆
3.两个构造函数之间原型对象之间的继承
原文:http://www.cnblogs.com/chen-q/p/5299506.html