代码之家  ›  专栏  ›  技术社区  ›  walnutmon

javascript-调用引用此内容的方法

  •  1
  • walnutmon  · 技术社区  · 14 年前

    不知道我在这里做错了什么,我只想让对象的函数引用对象范围

    myscit.js公司

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

    某些网页.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 回复  |  直到 14 年前
        1
  •  4
  •   Jakob    14 年前

    Lekensteyn和Ken各占一半。

    1. 您必须将“this”放入变量中,就像lekensteyn所做的那样,以便能够在嵌套函数内部引用它。
    2. 您必须使setmyfoosname在mybar范围之外可以访问,方法是将它分配给“this”属性,就像ken那样。

    我就是这样做的:

    function MyFoo () {
       this.name = 'myname';
    }
    
    function MyBar () {
       var that = this;
       this.myFoo = new MyFoo();
    
       this.setMyFoosName = function( name ) {
          that.myFoo.name = name;
       }
    }
    
        2
  •  0
  •   RobertPitt    14 年前

    不能用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.

        3
  •  0
  •   Lekensteyn    14 年前

    this 指的是 setMyFoosName 。你应该把 在变量中,并引用该变量:

    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 是否应可重写。