代码改变世界

javascript的prototype

2008-09-26 15:23  wlstyle  阅读(240)  评论(0)    收藏  举报
Code

在这里输出的color为black,表明这里的color是构造函数的中的属性color(this.color)。而不是原型(prototype)中的属性(color)。再看下面的代码:

 

1  function Car(sColor){
2      this.color=  sColor;
3  }
4  Car.prototype.color='red';
5  var oneCar=new Car();
6  alert(oneCar.color);//output undefined

 

这里输出的是undefined,表明这里color依然指向构造函数中的属性(this.color,因为sColor未定义,所以为undefined)。而不是原型(prototype)中的属性(color)。如果我们把Car原型中的属性color名称改为colors呢。

 

1  function Car(sColor){
2      this.color=  sColor;
3  }
4  Car.prototype.colors='red';
5  var oneCar=new Car('black');
6  alert(oneCar.colors);//output red

 

这里输出的red,对照第一段代码他可以表明当调用colors属性时候javascript解释器首先在构造函数中寻找如果找到则不继续寻找。如果没有找到则在继续在原型(prototype)中寻找。继续看下面代码。

 1  function Car(sColor){
 2      this.color=  sColor;
 3  }
 4  Car.prototype.colors='red';
 5 function fordCar(sColor,iWeight){
 6     Car.call(this,sColor);
 7     this.weight=iWeight;
 8 }
 9 fordCar.prototype= new Car();
10 fordCar.prototype.constructor= fordCar;
11 var fordcar1=new Car('black',30);
12 alert('colors is :'+fordcar1.colors);//output red
13 alert('kaka is :'+ fordcar1.kaka);//output undefined

 

这里输出的是red,fordCar里并没有定义colors属性。这里依然有输出。这主要是javascipt解释器在当前的对象没有查找到colors这个属性,就会去查找他的原型(prototype)。这里fordCar1的原型是Car的实例,他存在这个属性colors。所以会有输出。这里就是一个原型链。而属性kaka却没有输出。得到的是undefined。这里是因为在原型链中没有找到这个属性。