javascript - 了解 JavaScript 中的 "static"方法

标签 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() 不是一个函数?

最佳答案

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

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

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

<小时/>

* instanceof 运算符看起来好像存在连接,但实际上只是将实例原型(prototype)链中的对象与 .prototype 对象进行比较构造函数的关系,因此它仍然是一种间接关系,并且是可以打破的。

关于javascript - 了解 JavaScript 中的 "static"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29447616/

相关文章:

javascript - 如何在下一篇 JS 博客中实现上一篇文章和下一篇文章?

javascript - Angular Material 2 - 在单元测试的 md-checkbox 中触发更改事件

javascript - 如何从 JavaScript 中的自定义 json 字符串中提取值?

javascript - passport.authenticate 超时,不知道为什么

javascript - 我如何在django中显示以blob形式存储在mysql数据库中的pdf?

javascript - Firebase - ref 和 child 有什么区别?

javascript - 在 IE7 中未选中 webgrid 中突出显示的复选框

javascript - 使用 webpack Laravel 5.4 加载 Materialize 时出现 jQuery 错误

javascript - 使 Meteor 对 Meteor.user() 的特定子项有反应

javascript - Rails 外部 js 函数不触发