0

好的,这让我困惑了好几天!假设我有类似的东西:

var FooBar = function(args) {
   this.annoy = typeof args == "boolean" ? args : false;
   this.Foo();
}

FooBar.prototype.Foo = function() {
   if (this.annoy)
      window.alert("My name is Foo!")
   else
      window.console.log("My name is Foo!")
   this.Bar()
}

FooBar.prototype.Bar = function() {
   if (this.annoy)
      window.alert("My name is Bar!")
   else
      window.console.log("My name is Bar!")
}

这工作正常。但是,如果Bar()被定义为另一个对象的属性,它又是FooBar's的属性prototype,有没有一种方法可以访问annoynewBar()而不必annoy作为参数传递给它?例如:

FooBar.prototype.evenDeeper = {
   Bar: function() {
      // I wish to access "annoy" here!
   },

   anotherOne: function() {
   },

   yetAnotherOne: 'value'
}

我可能错了,但我确信 inside Foo(),Bar()会被称为this.evenDeeper.Bar(),不是吗?此外,如果Bar()想要递归怎么办?Bar()只是将自己称为Bar()自身内部,或作为Foobar.evenDeeper.Bar()this.Bar()或什么?

概括

  1. 如果在里面怎么Bar()访问?annoyevenDeeper
  2. 如何Bar()在自身内指涉自身?

免责声明:我什至alert()打算用s 来惹恼任何人!;)

4

1 回答 1

1

1. A) 将变量传递给 evenDeeper.Bar;B) 使用 evenDeeper.bar.apply(new FooBar(args)) 使用 'this' 访问 FooBar 原型;C) 为 evenDeeper.annoy 分配 FooBar.annoy 变量(不推荐,因为布尔值是按值传递的,它不会反映对它的更改)

2. A) 在 evenDeeper.Bar() 中使用 this.Bar() 并且它应该引用自身,除非您更改了“this”变量。B) 将 this.Bar 作为回调传递给 this.Bar() 并在其自身内部执行 C) 在函数上下文中声明 this.Bar() 以便它可以简单地将自身称为 Bar(),示例如下:

FooBar.prototype.evenDeeper = (function () {
    function Bar() {
        if (this.annoy) {
            alert('are you annoyed yet?');
        }
        Bar.apply(this);
    }
    return {
        Bar: Bar,
        anotherOne: function () {},
        yetAnotherOne: function () {}
    };
}());

var test = new FooBar(true);
// WARNING: this will never finish!
test.evenDeeper.Bar.apply(test);

这是一个通用的解决方案,如果您发布了更具体的内容,则很可能有更好的方法来实现您想要的。就个人而言,我会避免创建一个依赖于命名空间而不是它所在的命名空间的函数。

于 2013-08-10T14:15:09.453 回答