2

在我的项目中,我为每个网页创建模块并添加到一个名为View

应用程序.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();

})();

搜索视图.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();

})();

搜索.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 不支持这种创建对象的方式吗?

4

1 回答 1

1

你应该做几件事:

您的弱点在于您的 App.js 脚本可能会覆盖View由 SearchView.js 创建的对象。

  • 不要将一个变量同时用作命名空间和类。这是反直觉的。
  • 如果您已经在编写单例,则无需使用原型模式,尽管它没有任何问题。但是,您不会保存任何内存。

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

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

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

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

于 2012-08-13T12:13:22.530 回答