【问题标题】:Adding a property to a function向函数添加属性
【发布时间】:2017-08-26 03:38:38
【问题描述】:

您可以将属性分配给函数,但这是个好主意吗? 在这个例子中,我展示了你不能为函数inside创建一个属性,但是你可以outside它。

问:a.questionable 是否被认为是一种好的 JavaScript 编程实践?

function a() {
a.bad = 1
}
a.questionable = 2

function d() {
  console.log(a.bad)
  console.log(a.questionable)
}
d()

这个问题的灵感来自JavaScript: Understanding the Weird Parts

【问题讨论】:

  • 不应该是this.bad = 1吗?由于 a 在函数范围内未定义
  • ^ 不,除非a 是构造函数
  • 在函数内部创建属性同样有效——您只是从未调用a() 来运行它。在调用d() 之前将a(); 添加到您的代码中,您将得到a.bad1 输出。
  • @Damon 刚刚测试过,如果我仔细想想,它实际上是有道理的,因为它引用了全局范围。我只是从没想过会出现这种行为。谢谢 c:
  • 这可能有助于stackoverflow.com/a/8588847/7549867。是的,您可以添加,因为函数也是对象,但是如果您使用设计模式,那么它总是会要求您向对象添加属性并使用函数来修改它。很像 OOPS

标签: javascript


【解决方案1】:

在这个例子中,我展示了你不能在函数内部为函数创建属性,但你可以在函数外部。

实际上并非如此。您可以在任何引用它的地方向函数添加属性。问题是你还没有打电话给a(),所以a.bad = 1这行从来没有机会运行。

function a() {
a.bad = 1
}
a.questionable = 2

function d() {
  console.log(a.bad)
  console.log(a.questionable)
}
a()
d()

问:a.questionable 被认为是一种好的 JavaScript 编程实践吗?

jQuery 非常广泛地使用它(想想jQuery.fnjQuery.extend 等)——所以不,我不认为它本身被认为是一种“糟糕的”编程实践。事实上,在 ES6 将它们作为 class syntax 的一部分引入之前,向构造函数添加属性是模仿静态字段和方法的唯一方法。

function Constructor() {

}
Constructor.staticMethod = function () {
  return "I'm a static method!"
}

Constructor.staticProperty = "I'm a static property!"

console.log(
  Constructor.staticMethod(),
  Constructor.staticProperty
)

【讨论】:

  • 糟糕。对此感到抱歉。
【解决方案2】:

将属性放在函数上很好。事实上,这正是 ES6 类上的静态方法,这是 static 的唯一用途;考虑它明确的语言支持。

class Foo {
    static bar() {}
}

'bar' in Foo  // true
typeof Foo    // 'function'

在这个例子中,我展示了你不能在函数内部为函数创建属性,但你可以在函数外部。

您可以在该函数内的函数上创建一个属性,但期望函数体在不调用它的情况下运行是不合理的。

【讨论】:

  • 糟糕。对此感到抱歉。
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多