3

为什么我不能这样做?

var MyObject = {}
MyObject.foo = function(){
  this.sayhello = function(){
    alert('Hello');
  }
}
MyObject.foo.sayhello();

关于如何完成的任何想法?

4

4 回答 4

6

within foo, thisreferences MyObject,这意味着之后:

MyObject.foo();

您可以致电:

MyObject.sayhello();

如果你想能够调用MyObject.foo.sayhello(),你需要sayhello成为一个函数MyObject.foo

var MyObject = {}
MyObject.foo = function () {...};
MyObject.foo.sayhello = function () {
    alert('hello');
}

如果你不需要foo也是一个函数,你可以简单地声明:

var MyObject = {
    foo: {
        sayhello: function () {
            alert('Hello');
        }
    }
}

这将允许您致电:

MyObject.foo.sayhello();
于 2013-02-06T18:46:25.460 回答
1

您必须先调用MyObject.foo(),以便this.sayhello实际添加该函数。然后你应该可以打电话MyObject.foo.sayhello();

于 2013-02-06T18:46:20.333 回答
0
var MyObject = {}
MyObject.foo = {
  sayhello: function(){
    alert('Hello');
  }
}
MyObject.foo.sayhello();
于 2013-02-06T18:47:56.657 回答
0

那是因为该功能还不存在。因此,您必须先调用 foo。你所做的是从属性 foo 调用函数 sayhello。但是你没有属性 foo。你有一个函数 foo.

但你也可以这样做并使其成为链式,就像 jQuery 所做的那样:

var MyObject = {}
MyObject.foo = function(){
  this.sayhello = function(){
    alert('Hello');
  }
  return this;
}
MyObject.foo().sayhello();

在对象 foo 中创建一个 sayhello 函数,而不是链式函数。而是一个对象里面有一个函数的对象。

var MyObject = {
    foo : {
        sayhello : function(){
            alert("hello");
        }
    }
}
MyObject.foo.sayhello(); // Now does work!
于 2013-02-06T18:48:15.070 回答