具有属性的Javascript对象是关于'this'的函数详细信息

时间:2012-07-04 20:37:25

标签: javascript object scope this

var foo = {
  p1: function(){
    return this.p2;
  },

  p2: function(){
    console.log('i am foo.p2');
  }
};

我正在尝试做与上面示例类似的操作,但是当我调用时,我遇到了一个问题:

var result = foo.p1();

result =='undefined'

我对'this'在对象上下文中的工作方式感到困惑。有人可以解释我在哪里错了吗?

修改 更完整的例子:

suite_segments.themis = {

    //don't re-run themis initialization script
    initialized: false,

    /**
     * Initializer for themis product. Returns true if initialization
     * operations were performed, false if not (most likely because 
     * the product was already initialized -- not a fresh navigation)
     */
    init: function(){

            //prevent multiple initializations
            if(this.initialized)
                return false; //did not initialize
            this.initialized = true;

            //operations
            jQuery('#tabs').tabs();


            //init success
            return this.themis_destroy;         
    },





    /* ----------------------------------------------------------------------------------
     *      DESTRUCTORS
     * ----------------------------------------------------------------------------------/
    /**
     * Function to be invoked if user navigates away from 'themis' entirely. Other
     * sub-destroy type functions will be invoked if necessary when a user switches 
     * between parts of themis
     * 
     */
    themis_destroy: function(){

        console.log('themis_destructor');
        this.initialized = false;

    },
    /**
     * Designed to be overwritten every time a segment of themis is loaded. Will be invoked 
     * ever time a segment of themis is loaded.
     */
    themis_sub_destroy: function(){}


};

3 个答案:

答案 0 :(得分:1)

Doug Crockford在对象中有一个很好的page about private/public/privileged members,并讨论了定义这些成员的最佳实践。这可能有助于消除围绕this变量的一些混淆。

但是,在你的例子中,你不能向我们展示一些东西。 foo.p1的返回值是函数foo.f2,如下所示:

http://jsfiddle.net/erSWu/1/

答案 1 :(得分:1)

您完成的示例也可以使用。使用您的代码,suite_segments.themis.init() 返回descructor函数(或false),而不是undefined

但是你有另一个问题:析构函数不起作用。阅读this excellent overview about the this keyword,您会看到:this指向当前上下文,这与调用有关。当按...themis.init()调用时,函数将在themis对象的上下文中调用 - 一切都很好。但是返回的函数(suite_segments.themis.destroy)将不会在对象上调用,但(我猜)是独立的 - 并且没有机会设置正确对象的initialized属性。

在你的情况下,我可以推荐.bind() method来设置返回函数的上下文:

return this.themis_destroy.bind(this);

另请参阅this blog post about "objects with properties that are functions" or the mythof of methods,其中包含您的标题问题,以及this post about this

答案 2 :(得分:0)

你正在做一个矿工错误兄弟......

它应该是这样的:

var foo = {
  p1: function(){
    return this.p2();
  },

  p2: function(){
    console.log('i am foo.p2');
  }
};