原型和原型链
原型
参考链接:
http://blog.csdn.net/ligang2585116/article/details/53522741(转载)
参考链接:http://www.jb51.net/article/80109.htm(转载)
概念
原型是一个从其他对象继承属性的对象,任何对象都可以是原型,每个对象都有一个默认的原型,除了位于原型链顶端的原型,每一个原型本身也存在一个原型。
javacsript的对象中都包含了一个”[ [ Prototype] ]”内部属性,这个属性对应的就是该对象的原型。”[ [ Prototype] ]”作为内部属性,是不能直接访
prototype和 _proto_
prototype和_proto_两者是不一样的,但是长得非常像,很容易混淆,在理解原之前,我们先了解这两者。在javascript中,每个函数都有一个prototype属性,当一个函数被用作构造函数来创建实例的时,这个函数的prototype属性会被作为原型赋值给所有对象实例(也就是设置实例的_proto_属性),也就是说,所有实例的原型引用的是函数的prototype属性。
_proto_是每个对象都有的一个属性,而prototype是函数才会有的属性
- prototype
几乎所有的函数(除了内建函数外)都有名为prototype的属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以有特定类型的所有实例共享的属性和方法。hasOwnProperty()判断指定属性是否为自有属性。in操作符对自有属性和原型属性都返回true.
var obj ={ a: 1};
obj.hasOwnProperty(“a”); //true
obj.hasOwnProperty(“toString”); //false;
“a” in obj; //true;
“toString” in obj ; // true
- _proto_
对象具有属性_proto_ , 可称为隐式原型,即为内部属性[ [ Prototype ] ] ,可通过其追踪其原型对象,这保证了实例能够访问在构造函数原型中定义的属性和方法。可以通过Object.getPrototype()方法读取[ [Prototype] ]属性的值,可以通过isPrototypeOf() 方法检查某个对象是否是另一个对象的原型对象。
原型对象的作用:
原型对象的用途是为每个实例对象存储共享的方法和属性,所有的实例共享要给原型对象,有别于实例方法或者属性,原型对象仅有一份。
理解原型
每个函数被创建的时候都会有一个protype属性,这个属性会指向函数的原型对象。每个原型对象基本都会获取一个constructor属性,这个属性包含一个指向prototype属性所在函数的指针。以下图进行解析:
如图:
上图中创建了一个Person函数,它就会拥有一个prototype属性,这个属性指向了函数的原型对象Person Prototype,这个对象拥有一个constructor属性,其指向了prototype属性所在的函数Person. 当创建一个对象实例的时候,,就拥有一个prototype属性,这个属性会指向其原型对象特别注意,这里是指向原型对象而不是直接指向其构造函数Person,实例对象是通过原型对象与构造函数取得联系的。
函数的原型对象construct默认指向函数本身,原型对象除了有原型属性外,为了实现继承,还有一个原型链指针proto,该指针指向上一层的原型对象,而上一层的原型对象的结果类似,这样利用proto一直指向object 的原型对象,而Object的原型对象用Object.proto=null表示原型链的最顶端,如此变成了javascript的原型链继承。这样就很好地解释了所有的javacscript对象都具有Object的基本方法。
原型链
概念
每个对象和原型都有原型(除了最顶端原型),对象的原型指向原型对象。而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。
作用
当查找一个对象的属性时,javascript会向上遍历原型链,直到找到给定名称的属性为止,如果到查找原型链的顶部,也就是(Object.prototype),如果仍然没有找到指定的属性,就会返回undefined。