8.原型
在JavaScript中,函数是一种值。而原型(prototype)是函数的一个属性,这个属性的值是一个对象,下面看一个构造函数:
function Gadget(name,color){ this.name=name; this.color=color; this.whatAreYou=function(){ terutn 'I am a '+this.color+' '+this.name; } }
prototype和name、color、whatAreYou都属于Gadeget的属性。下面来给上面的构造函数的原型属性赋值,两种方法结果一样:
Gadget.prototype.price = 100; Gadget.prototype.rating = 3; Gadget.prototype.getInfo = function(){ return 'Rating: '+this.rating+',price: '+this.price; } //等价于 Gadget.prototype={ price:100, rating:3, getInfo:function(){ return 'Rating: '+this.rating+',price: '+this.price; } }
当我们使用构造器Gadeget()来新建一个newtoy对象,并访问rating属性的时候。JavaScript先会查询newtoy对象的所有属性,但却找不到rating的属性。接下来,脚本引擎会去查询用于创建当前对象的构造器函数的原型,等价于我们直接访问newtoy.constructor.prototype。如果在原型中找到了该属性,就立即使用该属性。
var newtoy = new Gadeget('webcam','black'); newtoy.name //webcam newtoy.rating //3
因为构造函数的原型属性值本身是一个对象,那么意味着它也有一个构造器方法,而这个构造器方法又会有自己的原型,这样就形成了原型链。