一段简单代码引入javascript
function Foo() {}; var f1 = new Foo();
1.概念简单理解html
Foo.prototype.constructor console.log(Foo.prototype.constructor === Foo);//true console.log(f1._proto_=== Foo.prototype);//true console.log(f1._proto_.constructor=== Foo);//true
console.log(f1.constructor === Foo);//true console.log(f1.hasOwnProperty('constructor'));//false
2.结合demojava
原型链是对于构造函数而言的,首先定义一个构造函数,再实例化生成一个实例对象,可能在实例对象中没有定义某个属性,可是在构造函数中有,那么它就会往上(向构造函数中)查找,这个查找的过程就叫作原型链。ide
function Foo(){}; Foo.prototype.name = "ziziyaya"; var foo=new Foo(); console.log(foo.name); //ziziyaya
3.为何须要原型链函数
为了实现继承,具备相同特性的代码不须要重复编写,放在构造函数里面,实例化的对象都会拥有里面的属性了,也就是能够共享属性和方法。ui
function Dog() { this.eat = 'food'; this.smell = 'smart'; } let dog1 = new Dog(); let dog2 = new Dog(); dog1.name = 'huang'; dog2.name = 'hei'; console.log(dog1.name+','+dog1.eat+','+dog1.smell);//huang,food,smart console.log(dog2.name+','+dog2.eat+','+dog2.smell);//hei,food,smart
推荐文章:http://www.ruanyifeng.com/blo...this
4.继续往上引伸--Foo.prototype的构造函数是Object(),原型对象是Object.prototypeidea
console.log(Foo.prototype.__proto__ === Object.prototype);//true
实例对象Foo.prototype自己具备constructor属性,因此它会覆盖继承自原型对象Object.prototype的constructor属性spa
下面是自身没有constructor属性,继承自原型对象的f1和 自身有constructor属性覆盖了原型对象的Foo.prototype 截图对比prototype
再往上引伸 若是Object.prototype做为实例对象的话,其原型对象是什么,结果是null
附加一篇简洁易懂的原型链理解的文章 http://www.cnblogs.com/shuiyi...