理解JavaScript的prototype

JavaScript可以说是最让人初学者难以理解的单一属性。我看了一些资料后,开始明白这些困难很大程度来自prototype这个名字本身的二义性。其实,关于prototype只要几句话就可以总结:

  1. 任何原型都是对象,只有对象有原型
  2. 只有Function有prototype属性,它是这个Function作为构造器时生成对象所继承的原型。Function的原型和它的prototype属性无关
  3. 对象的原型可以通过非标准的属性 __proto__ 或ECMAScript5的方法 Object.getPrototypeOf() 访问。

       1其实是错的,Object这个原型链尽头的对象它没有原型。可是为了更简单表述。在看原型链后你就会明白.toString()这类没有定义过的方法是怎样来的。

        上面说的二义性是语义上的,js语法本身没有歧义。prototype这个英文单词是原型的意思,可是一个对象的原型不是由prototype去访问。

Function有prototype属性,可是和自己的原型没有关系。理解这点后,再去看关于原型链、继承的文章就容易理解多了。

 

下面是些例子,可以加深认识:

 1 // 任何对象都有原型
2 obj = {};
3 console.log( obj.__proto__ );
4 console.log( Object.getPrototypeOf(obj) );
5 console.log( obj.__proto__ === Object.getPrototypeOf(obj) );
6
7
8 //对象并没有语法意义的prototype属性
9 alert(obj.prototype) //undefined
10
11
12 //prototype作为一个属性,仅存在于Function中,代表以这个Function创建的新实例继承的原型,和Function本身的原型无关
13 var F = function(name){
14 this.name = name;
15 }
16 obj = {a:3,
17 get b (){
18 return this.a;
19 }
20 };
21
22 F.prototype = obj;
23 newObj = new F('new name');
24
25 newObj.name; //作为构造器,name是newObj的自身属性
26 newObj.a; //3
27
28 //它继承了obj。可以通过这样证实:
29 Object.getPrototypeOf( newObj ) === obj; // true
30 newObj.__proto__ === obj; //true



posted on 2012-02-10 17:49  dindog  阅读(469)  评论(0)    收藏  举报

导航