javascript - 我什么时候想在 JavaScript 中使用 “class”(静态)方法或属性?

标签 javascript oop static-methods coffeescript prototypal-inheritance

在 JavaScript 中,为什么要将属性直接附加到构造函数?

var Human = function() {};
Human.specie = "Homo Sapience";

在查看 CoffeeScript 的 __extend 辅助函数后,我得到了这个问题,其中包含:

for ( var key in parent ) { 
  if ( __hasProp.call( parent, key ) ) child[key] = parent[key]; 
} 

直接从构造函数对象复制属性/方法到子类对象。但是为什么会有人这样做呢?

谢谢!

最佳答案

(编辑:在其原始形式中,问题询问的是将属性附加到类还是将它们附加到原型(prototype),这就是我要回答的问题。)

这实际上更像是一个约定俗成的问题。如果你写

Human::specie = "Homo sapiens"

(其中 Human::specieHuman.prototype.specie 的 CoffeeScript 简写)然后声明 jane = new Human,然后 jane.specie 将是 "Homo sapiens"(除非您专门将 jane.specie 设置为其他内容)。在这种情况下,这听起来很可取。

但在其他情况下,在大量原型(prototype)之间共享一个属性会使您的代码更难理解。假设您有一个带有 config 对象的 Logger 类。如果将该对象附加到原型(prototype),则可以编写如下代码:

log = new Logger
log.config.destination = './foo'

这会将 所有 Logger 实例的目的地更改为 './foo',因为只有一个 config对象。如果您希望 config 应用于所有 Logger 实例,那么您应该将其附加到适当的类,从而消除上面代码中的歧义:

log = new Logger
Logger.config.destination = './foo'

关于javascript - 我什么时候想在 JavaScript 中使用 “class”(静态)方法或属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6517040/

相关文章:

用于验证用户输入正确信息的 Javascript 代码

javascript - 如何在不重新加载的情况下实现无缝向下滚动到下一页?

javascript - 逐步执行功能时遇到麻烦,减少了一系列功能

python - 返回其类实例的静态方法

javascript - 由于隐藏的选择元素,按钮被禁用

java - 封装到底是什么?

php - OOP PHP 连接和选择函数

oop - Grails中的服务方法或域静态方法?

c++ - 方法中声明的静态变量有多少个实例?

Java 静态方法调用