JavaScript - 调用引用它的方法

时间:2010-09-17 14:02:44

标签: javascript jquery

不确定我在这里做错了什么,我只是希望能够将对象的功能引用到对象范围

myscipt.js

function MyFoo () {
   this.name = 'myname';
}

function MyBar () {
   this.myFoo = new MyFoo();

   function setMyFoosName( name ) {
      this.myFoo.name = name;
   }
}

somepage.html

<scipt>

$('document').ready( function() {
    $.myBar = new MyBar();
}

...
some action
...

$.myBar.setMyFoosName( 'new name' );

</script>

这引发了一个例外:

this.myFoo.name = name; this.myFoo is not defined

3 个答案:

答案 0 :(得分:4)

Lekensteyn和Ken各得一半。

  1. 你必须把“this”放在变量中,就像Lekensteyn一样,以便能够在嵌套函数中引用它。
  2. 你必须在MyBar范围之外访问setMyFoosName,方法是将其分配给“this”属性,就像Ken一样。
  3. 我就是这样做的:

    function MyFoo () {
       this.name = 'myname';
    }
    
    function MyBar () {
       var that = this;
       this.myFoo = new MyFoo();
    
       this.setMyFoosName = function( name ) {
          that.myFoo.name = name;
       }
    }
    

答案 1 :(得分:0)

this引用setMyFoosName的范围。您应该将this放入变量中,并引用该变量:

function MyFoo () {
   this.name = 'myname';
}

function MyBar () {
   var that = this;
   this.myFoo = new MyFoo();

   this.setMyFoosName = function( name ) {
      that.myFoo.name = name;
   }
}

尽量避免导出应该保密的变量:

function myFoo () {
   this.name = 'myname';
}

function MyBar () {
   /* myFoo is private */
   var myFoo = new MyFoo();
   this.setMyFoosName = function( name ) {
      myFoo.name = name;
   }
}

通过这种方式,你不能破坏你的功能:

$.myBar = new MyBar();
$.myBar.myFoo = new EvilObject();
$.myBar.setMyFoosName();

当然,这取决于您的使用,myFoo是否应该可以覆盖。

答案 2 :(得分:0)

您是否可以使用JSON数据类型执行实例静态方法?

    var MyFoo = {
        _instance : null,

        Instance : function(){
            if(this._instance == null)
            {
                this._instance = new this.Object();
            }
            return this._instance;
        },

        Object : function()
        {
            this.name = 'not robert';
        }
    }


    function MyBar (){    
       this.setMyFoosName = function ( name ) {
          MyFoo.Instance().name = name;
       }
    }

Bar = new MyBar()
Bar.setMyFoosName('Robert');

只要MyFoo在全球范围内,就可以提供更多的全球范围等等。

Example here.