2009-10-14 57 views
1

我对我的JavaScript对象有点问题。我想要做的就是传入一个id并让它设置一个可供我的所有函数访问的变量。Javascript中的对象参数

这里是什么,我有一个小例子:

var myObject = function() { 
    var pageSize = 6; 
    var currentPage = 1; 
    var pagerPagesVisible = 5; 
    var pagerId = '#my-pager'; 
    var entityId = ''; 

    var doStuff = function() { 

     var endIndex = pageSize * currentPage; 
     var startIndex = endIndex - pageSize; 

     $.ajax({ type: "GET", url: "/items/" + this.entityId + "/entities/" + startIndex + "/" + pageSize + "/", dataType: "json", success: loadData, cache: false, 
      error: function(response, status, error) { 
       alert(response.responseText); 
      } 
     }); 

    }; 

    var loadData = function(data) { 
     var itemCount = data.length; 

     //build the html and write to the page 

     buildPager(itemCount); 
    }; 


    var buildPager = function(itemCount) { 

     pager.build(pagerId, pageSize, itemCount, currentPage); 

    }; 

    var attachEvents = function() { 
     //attach events to the pager 
    }; 

    return { 

     init: function(entityId) { 
      this.entityId = entityId; 

      doStuff(); 
     } 
    } 
}(); 

的问题是,在初始化,它设置你在上面看到ENTITYID实例。但是,当它命中doStuff()entityId被设置回''。

+0

是的,我意识到我可以将entityId传递给doStuff,但这不是我要去的地方。 – Josh 2009-10-14 18:04:52

回答

1

你混合关闭和对象样式 - 你需要是一致的:

<script> 

var myObject = function() { 
    var pageSize = 6; 
    var currentPage = 1; 
    var pagerPagesVisible = 5; 
    var pagerId = '#my-pager'; 
    var entityId = ''; 

    var doStuff = function() { 
     alert(entityId); 
    }; 

    return { 

     init: function(myEntityId) { 
      entityId = myEntityId; 

      doStuff(); 
     } 
    } 
}(); 

myObject.init(123); 

</script> 
+0

更改输入参数的名称做了窍门谢谢。 – Josh 2009-10-14 18:33:29

-1

这是因为entityId变量是本地的功能,并没有任何与你在最后创建对象。相反,将所有对象放在最后,而不是放在函数中。

例如。

var myObject = function() { 
    var pageSize = 6; 
    var currentPage = 1; 
    var pagerPagesVisible = 5; 
    var pagerId = '#my-pager'; 

    return { 
    doStuff: function() { 
     var endIndex = pageSize * currentPage; 
     var startIndex = endIndex - pageSize; 
     var self = this; 

     $.ajax({ 
     type: "GET", 
     url: "/items/" + this.entityId + "/entities/" + startIndex + "/" + pageSize, 
     dataType: "json", 
     success: function() { self.loadData(); }, 
     cache: false, 
     error: function(response, status, error) { 
      alert(response.responseText); 
     } 
     }); 
    }, 
    loadData: function(data) { 
     var itemCount = data.length; 
     this.buildPager(itemCount); 
    }, 
    buildPager = function(itemCount) { 
     pager.build(pagerId, pageSize, itemCount, currentPage); 
    }, 
    attachEvents: function() { 
     //attach events to the pager 
    }, 
    entityId: '', 
    init: function(entityId) { 
     this.entityId = entityId; 
     this.doStuff(); 
    } 
    }; 
}(); 
+0

你已经通过这样做了所有的私人方法 – Greg 2009-10-14 18:19:02

+0

是的。那是问题吗?一切都在JavaScript中公开,fwiw。这只是为了展示问题中的范围问题。如果对私有方法有所顾虑,那么这些方法可以毫无问题地移出对象。最坏的情况下,你只需要从公共方法中传递一些额外的东西给他们。我不明白这是如何让我的回答错误的。 – rfunduk 2009-10-14 18:22:42

+0

@thenduks说出JavaScript中的所有内容都是公开的...通常是真的。但是,有点误导。如果有人对我说一种语言,那么它就表明根本没有封装,所有变量和属性都是公开的。但在JavaScript中情况并非如此。您可以通过使用闭包获取私有函数和变量 - http://www.crockford.com/javascript/private.html – Matt 2009-10-14 18:31:28

0

其他人在这里回答了你的问题,但我想指出的是,你可能要使用的原型,如果你将要创建许多对象。

当你把你的方法括起来时,你会在每个实例化中浪费内存。

ClassName.prototype.methodname = function(){ ... }