1.什么是原型?javascript
原型是一个对象,其余对象能够经过它实现属性继承。java
这里有两个概念,我第一次看原型这块的时候蒙蒙的~~过几天以后就……gg了……函数
prototype(原型)属性: 咱们建立的每一个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象包含能够有特定类型的全部实例共享的属性和方法。这个对象就是原型对象。spa
简化一下,每一个函数都有一个prototype属性,指向函数的原型对象。prototype
看一段代码3d
1 function Foo() { 2 } 3 Foo.prototype.name = "奥特曼"; 4 Foo.prototype.take = function() { 5 var ftake = "打" 6 return ftake; 7 } 8 var obj = new Foo();
默认状况下全部原型对象都会自动得到一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。在本例中,原型对象Foo.prototype的constructor属性指向Foo。指针
原型对象的内部还包括一个指针__proto__指向构造函数的原型对象。code
也就是说上例的原型对象是这样的对象
Foo.prototype { constructor: Foo, __proto__: Object.prototype, name:"奥特曼", take: function() { var ftake = "打" return ftake; } }
此处应该有图……我去画一个……blog
我已经尽力了……真的……我想有朝一日成为大神看见如今写的画的这些鬼……我会羞愧吧……凑合看吧。。。
虽然这图歪七扭八的,可是,仍是能够看滴,原型链就这么出来啦!!哈哈
2.原型链
首先捏,咱们查找属性来看一看这个例子的原型链。
obj.name 找到了奥特曼~~
可是呢,name是obj的属性吗???
不是捏~~那么是怎么回事呢??
当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止,到查找到达原型链的顶部 - 也就是 Object.prototype - 可是仍然没有找到指定的属性,就会返回 undefined。
那么若是我给obj.name赋值呢?
obj有了name属性了,那么Foo.name是否也改变了呢??
结果是Foo.name并未改变。咱们发现namet是按着咱们所说的向上查找来获得结果的,属性在查找的时候是先查找自身的属性,若是没有再查找原型,再没有,再往上走,一直插到Object的原型上.
咱们给obj.name赋值.obj.name = "小怪兽",实例obj就有了name属性。全部咱们会在属性查找时找到obj.name,可是Foo.name也并未改变。
而咱们能够使用toString().hasOwnProperty()等方法也是从原型链向上查找到Object原型上的方法~~
未完待续~~