2009-10-14 45 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(){ ... }