2.25学习经验分享#
Bruce_Zhu于2017.2.25
一. 原型对象
在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性。其中函数对象的一个属性就是原型对象 prototype。注:普通对象没有prototype,但有proto属性。
原型对象其实就是普通对象(Function.prototype除外,它是函数对象,但它很特殊,他没有prototype属性(前面说道函数对象都有prototype属性))。看下面的例子:
<pre>
function f1(){};
console.log(f1.prototype) //f1{}
console.log(typeof f1. prototype) //Object
console.log(typeof Function.prototype) // Function,这个特殊
console.log(typeof Object.prototype) // Object
console.log(typeof Function.prototype.prototype) //undefined
</pre>
从这句console.log(f1.prototype) //f1 {} 的输出就结果可以看出,f1.prototype就是f1的一个实例对象。就是在f1创建的时候,创建了一个它的实例对象并赋值给它的prototype,基本过程如下:
<pre>
var temp = new f1();
f1. prototype = temp;
</pre>
所以,Function.prototype为什么是函数对象就迎刃而解了,上文提到凡是new Function ()产生的对象都是函数对象,所以temp1是函数对象。
<pre>
var temp1 = new Function ();
Function.prototype = temp1;
</pre>
那原型对象是用来做什么的呢?主要作用是用于继承。举了例子:
<pre>
var person = function(name){
this.name = name
};
person.prototype.getName = function(){
return this.name;
}
var zjh = new person(‘zhangjiahao’);
zjh.getName(); //zhangjiahao
</pre>
从这个例子可以看出,通过给person.prototype设置了一个函数对象的属性,那有person实例(例中:zjh)出来的普通对象就继承了这个属性。
二.原型链
JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做proto的内置属性,用于指向创建它的函数对象的原型对象prototype。以上面的例子为例:
<pre>
console.log(zjh.proto === person.prototype) //true
</pre>
同样,person.prototype对象也有proto属性,它指向创建它的函数对象(Object)的prototype
<pre>
console.log(person.prototype.proto === Object.prototype) //true
</pre>
继续,Object.prototype对象也有proto属性,但它比较特殊,为null
<pre>
console.log(Object.prototype.proto) //null
</pre>
我们把这个有proto串起来的直到Object.prototype.proto为null的链叫做原型链。如下图: