6

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

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

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

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

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

谢谢!

4

3 回答 3

2

编辑:在其原始形式中,问题是关于将属性附加到类与将它们附加到原型,所以这就是我要回应的。)

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

Human::specie = "Homo sapiens"

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

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

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

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

log = new Logger
Logger.config.destination = './foo'
于 2011-06-29T17:11:17.123 回答
1

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

于 2011-06-29T17:10:10.600 回答
0

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

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

// There are constants
Math.E
Math.PI
Math.SQRT2
// And there are also methods
Math.ceil
Math.cos
Math.sin

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

于 2011-10-25T16:23:47.537 回答