4

我正在阅读 Ninja Secrets of JS Book 并看到这部分示例代码:

    var ninja = {
      chirp: function signal(n) {                              //#1
        return n > 1 ? signal(n - 1) + "-chirp" : "chirp";
      }
    };

    var samurai = { chirp: ninja.chirp }; 

   ninja = {}; 

所以我理解了第一部分:我们有一个对象ninja,它有一个方法。

我了解第二部分,现在我们正在创建一个名为的新对象samurai,它有一个名为chirp.

让我困惑的ninja.chirp部分是它的一部分,我们在这里做什么?它是如何工作的?

4

3 回答 3

5

它获取对象(它是一个函数)的属性值并将其分配给正在构造的对象的chirp属性。ninjachirp

这是一个更简单的示例(使用字符串而不是函数):

var foo, bar;
foo = { "an": "object" };
bar = { "an": foo.an }
alert(foo.an);
alert(bar.an);
于 2013-04-06T22:13:22.143 回答
2

这个例子我已经看过很多次了,这是一个可怕的例子。对于初学者来说,命名函数表达式在 IE 中是错误的,但除此之外,它们完全没有必要,因为您可以简单地引用arguments.callee.

除此之外,使用递归函数重复字符串只是自找麻烦。整个事情可以变得更简单:

function signal(n) {
    return new Array(n+1).join("-chirp").substr(1);
}
于 2013-04-06T22:13:35.510 回答
1

在这里,chirp它被复制到samurai. 比您可以销毁ninja对象并仍然使用该samurai.chirp方法。

于 2013-04-06T22:18:24.177 回答