在这之前先说明几个问题:
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属性,要不然会出现一些莫名其妙的问题!