【问题标题】:JavaScript - function as an object propertyJavaScript - 作为对象属性的函数
【发布时间】:2011-03-17 02:54:39
【问题描述】:

大家好,这是来自 John Resig Advanced JavaScript http://ejohn.org/apps/learn/#23 的 #23,名为

What happens if a function is an object property.

1) 关于词汇,变量 katana 是对象,对吗?如果匿名函数是它的属性,那么什么叫“使用”?我以为“使用”也会被称为属性?还是“使用”也是一个对象,因为它包含一个值,即一个函数?

2)。函数的目的是将isSharp:true更改为isSharp:false吗? !this.isSharp 究竟做了什么?

3) 当它断言 !katana.isSharp 时,它实际断言的是什么?那 isSharp 现在已经设置为“false”了吗?

var katana = {
  isSharp: true,
  use: function(){
    this.isSharp = !this.isSharp;
  }
};
katana.use();
assert( !katana.isSharp, "Verify the value of isSharp has been changed." );

【问题讨论】:

    标签: javascript


    【解决方案1】:
    1. 是的,katana 是一个对象(使用 { ... } 表示法创建)。 “use”是对象的属性名称,其将是匿名函数(也是一个对象)。

    2. 函数将isSharp的值取反(所以从truefalsefalsetrue)。

    3. 它断言isSharp 是不评估为真的东西(这几乎是除了undefinednullfalse0 等之外的所有内容)。在这种情况下,由于isSharp 始终是truefalse,因此它断言它是false

    示例的要点(和很酷的部分)是这一行:

    katana.use();
    

    这首先从katana 对象(即katana.use 部分)中获取“使用”属性的值。该值是之前的匿名函数。然后,执行该函数(即() 部分)。真正酷的部分是它代表katana 对象执行——这意味着匿名函数中的this 在以这种方式调用时是对katana 对象的引用。

    【讨论】:

    • 它断言 isSharp 是“假的”! falsy 和 not true (明显)不同。
    • @Raynos:嘿,是的,这就是为什么我用“不是真的”而不是“不是true”。如果您将 true 定义为“不为 false 的东西”,这是有道理的 :-) 我会使其不那么模棱两可,感谢您指出这一点
    • 非常感谢。你说很酷的部分是它代表 Katana 对象执行。为什么很酷?是否创造了一些实际优势?如果是这样,它带来的实际优势是什么?
    • @mjmitche:我只是认为一个不附加到任何特定对象的匿名函数可以代表一个人执行而不需要调用apply,这很酷(这是非常主观的)。 (不可否认,大多数 Javascript OOP 都是这样完成的,但我仍然对此感到惊叹。)没有 实用 优势,只是一些很好的语法糖,这也使它在大多数情况下“正常工作”,即使你不知道发生了什么
    【解决方案2】:

    1) Katana 是一个对象。 Katana.use 是一个函数。它是一个包含函数作为值的属性。它包含的值恰好是一个匿名函数。

    区别在于Katana.useKatana 的一个属性,而Katana.use 的值是一个函数。 use 是在 Katana 上定义的键,因为 Katana["use"] 也可以使用。

    2) 将 isSharp 设置为 NOT isSharp 所以要么是 true -> false 要么是 false -> true

    3) 断言说 katana.isSharp === false 应该是这样,因为它最初是 true,但后来设置为 false。

    【讨论】:

      【解决方案3】:
      1. use 是对象 katana 的属性。
      2. !this.isSharp 将否定 this.isSharp 的值。例如,如果 isSharp 为 true,它将返回 false,否则返回 false。
      3. 断言检查布尔结果的结果是否为真。如果结果为 false,则断言失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        • 2013-10-11
        • 2016-04-09
        • 1970-01-01
        相关资源
        最近更新 更多