IE中的Javascript命名空间抛出错误

时间:2012-08-13 11:41:59

标签: javascript

在我的项目中,我为每个网页创建模块,并添加到名为View的基础对象中:

App.js

var View = (function()  {

    var View  = function()  {
        this.attributes = {
            baseUrl : '',
            urls : {}
        };
    };

    View.prototype.setUrl = function(url)   {
        this.attributes.baseUrl = url;
    };

    View.prototype.getUrl = function()  {
        return this.attributes.baseUrl;
    };

    return new View();

})();

SearchView.js

var View = View || {};

var SearchView = View.SearchView = (function()  {

    var Private = {
        search : function(url)  {},
        loadSearchResult : function()   {},
        clearSearchForm : function()    {}
    };

    Private.search = function(url)  {
        ajax(url,...);
        this.loadSearchResult();
    };

    var SearchView = function() {
        this.settings = {};
    };

    SearchView.prototype.loadEventBindind = function()  {
        $(document)

        .on('click','#search-button', function()    {
            Private.search(View.baseUrl);
        })

        .on('click','#reset-search', function() {
            Private.clearSearchForm();
        });
    };

    return new SearchView();

})();

search.html

<script type="text/javascript" src="media/scripts/Modules/App.js"></script>
<script type="text/javascript" src="media/scripts/View/SearchView.js"></script>
<script type="text/javascript">
    View.setUrl('http://www.set.com/');
    View.SearchView.loadEventBindings();
</script>

此代码在Chrome和Firefox中正常运行,但在IE中引发错误:

  

'View.SearchView'是null或不是对象

IE不支持这种创建对象的方法吗?

1 个答案:

答案 0 :(得分:1)

你应该做的事情很少:

您有一个弱点,即您的App.js脚本可能会覆盖SearchView.js创建的View对象。

  • 不要将一个变量用作命名空间和类。这是违反直觉的。
  • 如果你已经在编写单例,那么就没有必要使用原型模式,尽管它没有任何问题。你不会保存任何记忆。

如果您坚持使用View作为类和命名空间,请执行此类更改以防止View被覆盖。

var View = View || {};
var ViewTmp;
$.extend(ViewTmp = (function()  {

    var View  = function()  {
    ...
  ...
})(), View);
View = ViewTmp;

此脚本假定您使用的是jQuery(因为$.extend方法)。