理解JavaScript中的“静态”方法

时间:2015-04-04 14:32:46

标签: javascript

我的困惑源于此代码段的最后一行:

function Animal(name) {
    Animal.count = Animal.count+1||1;// static variables, use function name "Animal"
    this.name = name; //instance variable, using "this"
}

Animal.showCount = function () {//static method
    alert(Animal.count)
}

Animal.prototype.showName=function(){//instance method
    alert(this.name);
}

var mouse = new Animal("Mickey");
var elephant = new Animal("Haddoop");

Animal.showCount();  // static method, count=2
mouse.showName();//instance method, alert "Mickey"
mouse.showCount();//Error!! mouse.showCount is not a function, which is different from  Java

问题:为什么mouse.showCount()不是函数?

1 个答案:

答案 0 :(得分:3)

JavaScript没有传统意义上的静态方法。您所做的只是将函数指定为另一个函数(构造函数)的属性。请记住,函数是JS中的对象。

因此,从构造函数和构造函数本身创建的对象实例之间没有直接关系。唯一的*关系是实例和构造函数的.prototype对象之间的关系。

如果你要覆盖构造函数的.prototype,那么就不会有那种间接关系。所以基本上构造函数只是在.prototype和正在创建的新对象实例之间充当临时“匹配器”。之后,构造函数不起作用。


* instanceof运算符使得它看起来好像有连接,但它实际上只是将实例原型链中的对象与构造函数的.prototype对象进行比较,所以它仍然是间接关系和可以打破的关系。