【问题标题】:Javascript Namespace that works in IE/Firefox/Chrome适用于 IE/Firefox/Chrome 的 Javascript 命名空间
【发布时间】:2011-07-24 09:09:46
【问题描述】:

我正在尝试创建一个命名空间来封装我们所有的 javascript 类,但是在 ie9 和 POI.prototype.getFullAddress 上的 ie9 和 firefox 之后得到一个 missing : after property id > 线(POI 后的停靠点)。第二个问题是当我尝试初始化对象 var x = new Makani.POI(a,b,c...) 我得到 javascript 错误并且必须使用 var x = Makani .POI(a,b,c...) 没有新的关键字,这很奇怪。我发布了完整的代码以供参考。感谢您的帮助。

/* Makani Javascript Libraries */

var Makani = function () {

var private_var;

function private_method() {

    // do stuff here

}

return {

    POI: function(ID, Title, Section, District, City, Governorate) {
        this.ID = ID;
        this.Title = Title;
        this.Section = Section;
        this.City = City;
        this.Goverorate = Governorate;
    },

    POI.prototype.getFullAddress = function (opts) {

        if (("includeCity" in opts) && (opts["includeCity"] == false))
            return this.Section + ", " + this.District;
        else if (("includeGovernorate" in opts) && (opts["includeGovernorate"] == false))
            return this.Section + ", " + this.District + ", " + this.City; 
        else return this.Section + ", " + this.District + ", " + this.City + ", " + this.Governorate;
    }

};     
} ();

【问题讨论】:

    标签: javascript oop namespaces


    【解决方案1】:

    JS 中的object initialiser对象字面量)如下所示:

    {
        propName: 123,
        123: 'some value',
        hmmAFunction: function(){}
    }
    

    一般来说,它是PropertyName : AssignmentExpression,每个键/值对用逗号分隔。所以,当你这样做时:

    return {
    
        POI: function(ID, Title, Section, District, City, Governorate) {
    
        },
    
        // THIS
        POI.prototype.getFullAddress = function (opts) {
    
        }
    
    };  
    

    ...它是无效的,并且会导致错误被抛出。

    试试这个:

    var Makani = {
        POI: (function(){
    
            function POI (ID, Title, Section, District, City, Governorate) {
                this.ID = ID;
                this.Title = Title;
                this.Section = Section;
                this.City = City;
                this.Goverorate = Governorate;
            }
    
            POI.prototype.getFullAddress = function (opts) {
    
                if (("includeCity" in opts) && (opts["includeCity"] == false))
                    return this.Section + ", " + this.District;
                else if (("includeGovernorate" in opts) && (opts["includeGovernorate"] == false))
                    return this.Section + ", " + this.District + ", " + this.City; 
                else return this.Section + ", " + this.District + ", " + this.City + ", " + this.Governorate;
            };
    
            return POI;
    
        }())
    };
    

    另外,我建议不要以大写字母开头的变量名(例如District),除非它引用的是构造函数(例如POI)。

    【讨论】:

    • 感谢它的工作,但在阅读了有关原型对象的更多信息后,它认为我没有以正确的方式使用它,我的意思是 附加 getFullAddress 函数没有用所有实例,而不是直接将其添加到 POI 类。但是,当我尝试将 POI.prototype.getFullAddress 重命名为 POI.getFullAddress 时,在初始化后调用 getFullAddress 函数时出现错误,var x = new Makani.POI(...), x.getFullAddress()
    【解决方案2】:

    也许你只是想要这个:

    POI.getFullAddress: function (opts) {

    看起来您正在尝试更改原型,但您正在该特定块中创建对象定义。另一种方法是将return 部分创建为var,然后扩展原型,然后返回它。

    你在做一个简单的水平是这样的:

    x = {
      name1: value,
      name2 = value
    }
    

    这不是有效的语法。

    【讨论】:

    • 参见bclary.com/2004/11/07/#a-11.1.5 ...您不能在未引用的属性名称中包含.。此外,我们甚至不想要一个名为POI.getFullAdress 的属性。对于要操作的对象的原型属性,该对象需要是可引用的......因此,在一个对象初始化程序中完成这整个事情是行不通的。请看我的回答。
    • 是的,我试图将其归结为基本问题:语法无效。我建议的“其他方式”就是你所做的。但是出于他在这里尝试做的事情的目的,我看不出将getFullAddress 添加到原型中的意义,为什么不将其添加为成员呢?看起来更清楚了,因为它在函数内部,所以无论如何你都无法在没有它的情况下创建 POI。
    • 我最初是尝试创建一个简单的javascript对象,然后我尝试像上面一样封装在命名空间中,为什么在将原型添加到命名空间函数POI(ID , Title, Section, District, City, Governorate) {... and POI.prototype.getFullAddress = function (opts) {...'
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2012-01-27
    相关资源
    最近更新 更多