在这之前先说明几个问题:
prototype是JavaScript中所有对象都具有的属性,
constructor是用new创建函数的才有的属性。
当使用new来创建一个函数时,JavaScript会自动创建一个prototype属性,并且将prototype.constructor属性指向该函数本身。
见下面的例子(在firebugs下完成):
>>> Object.prototype. constructor === Object
true
>>> function Hero() {this.name = "Hero"}
>>> Hero.prototype.constructor == Hero
true
>>> var h1 = new Hero()
>>> h1.constructor //没有更改prototype的情况下,h1.constructor是正确的
Hero()
>>> Hero.prototype = {} //将Hero.prototype制空
Object
>>> var h2 = new Hero()
>>> h2.constructor //h2.constructor是错误的
Object()
>>> function Hero2() {this.name = "Hero2"}
>>> Hero.prototype = new Hero2 //将Hero.prototype制为Hero2
Object
>>> var h3 = new Hero()
>>> h3.constructor //h3.constructor是错误的
Hero2()
>>> Hero.prototype.constructor = Hero //将Hero.prototype.constructor设置回去
Hero()
>>> var h4 = new Hero()
>>> h4.constructor //恢复正常
Hero()
所以在自己设置函数的prototype时,一定要同时更改函数的constructor属性,要不然会出现一些莫名其妙的问题!