向函数添加属性

时间:2017-03-31 19:02:48

标签: javascript

您可以为函数指定属性,但这是个好主意吗? 在这个例子中,我表明你不能为函数里面的函数创建一个属性,但你可以之外。

问: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

2 个答案:

答案 0 :(得分:3)

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

class Foo {
    static bar() {}
}

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

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

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

答案 1 :(得分:3)

  

在此示例中,我显示您无法为函数内的函数创建属性,但您可以在其外部。

事实并非如此。您可以在任何有参考的函数的属性中添加属性。问题是您没有调用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
)