我想什么时候使用“;类别”;JavaScript中的(静态)方法或属性?

我想什么时候使用“;类别”;JavaScript中的(静态)方法或属性?,javascript,oop,static-methods,coffeescript,prototypal-inheritance,Javascript,Oop,Static Methods,Coffeescript,Prototypal Inheritance,在JavaScript中,为什么要将属性直接附加到构造函数 var Human = function() {}; Human.specie = "Homo Sapience"; 在看了CoffeeScript的\uu extend助手函数后,我有了这个问题,该函数包含以下几行内容: for ( var key in parent ) { if ( __hasProp.call( parent, key ) ) child[key] = parent[key]; } 它将属性/方法直

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

var Human = function() {};
Human.specie = "Homo Sapience";
在看了CoffeeScript的
\uu extend
助手函数后,我有了这个问题,该函数包含以下几行内容:

for ( var key in parent ) { 
  if ( __hasProp.call( parent, key ) ) child[key] = parent[key]; 
} 
它将属性/方法直接从构造函数对象复制到子类对象。但为什么会有人这么做


谢谢

在游戏中,假设您有一个名为world的对象。然而,游戏中只有一个世界。从理论上讲,这就是您这样做的原因。

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

这实际上是一个惯例问题,而不是其他任何事情。如果你写信

Human::specie = "Homo sapiens"
(其中
Human::specie
是咖啡脚本对
Human.prototype.specie
的简写)然后声明
jane=newhuman
,然后
jane.specie
将是
“智人”
(除非您特别将
jane.specie
设置为其他内容)。在这种情况下,这听起来是可取的

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

log = new Logger
log.config.destination = './foo'
这会将所有
Logger
实例的目标更改为
'./foo'
,因为只有一个
config
对象。如果希望
config
应用于所有
Logger
实例,则应将其附加到类本身,以消除上述代码中的歧义:

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

简而言之,发布的问题的答案是名称间距。有些值可能有意义,可以在整个程序中共享,并且在语义上与某些类有关。这些函数和值可以放在一些变量中,但将它们附加到构造函数中是可行的,以便为它们命名名称空间

最好的例子是JavaScript
Math
class(对于纯粹主义者,我知道它不是一个真正的类,而是一个对象):


所以方法和值(保存在常量中)总是相同的,它们不依赖于调用它们的实例,将它们放在实例上是没有意义的

但是,使用
var-world={/…}不是更好吗无论如何?当然,在创建对象时,您会将初始值放入构造函数中,但对于以后的更改,您只需执行world.population=6775235700;我的意思是,如果对象最终只有一个实例,为什么还要有任何类来描述它,因为你可以用文字符号来描述它;世界人口=6775235700;而不仅仅是增长=2;人口=6775235700;使用静态类,程序员可以更清楚地理解这两个变量是相关的。这意味着您将使用构造函数作为名称空间,这仍然可以通过简单地使用对象文字来实现:
var-world={growth:2}很抱歉编辑了这个问题,在这么长的时间里,它似乎有点遗漏了要点。在您的示例中,我不确定我是否理解为什么更改一个实例的属性(
log.config
)会影响其他实例–我们并不是通过修改一个实例的属性/方法来更改原型。谢谢因为它们实际上是同一个对象。(我有点详细地讨论过这一点。)如果设置
log.config=something
,则不会影响其他
Logger
实例。但是如果你写
log.config.x=y
,这相当于
Logger::config.x=y
。这是一个更好的说法,Trevor,Logger::config==Logger.prototype.config,可以通过log.config?@c3rin访问,只要
log.hasOwnProperty('config')
false
,则这两条语句都是准确的。
// There are constants
Math.E
Math.PI
Math.SQRT2
// And there are also methods
Math.ceil
Math.cos
Math.sin