0

我有一个js/jsClasses.js相对于该文件的名为的 javascriptindex.html文件。

这个文件有一些嵌套函数。这是代码 -

function JSClass(){ //notice the capital J which though doesn't change execution is a convention indicating a class constructor
var langSetting;
this.setLanguage = function(){
    langSetting = "en-GB";
    console.log(langSetting);
}
this.getLanguage = function(){
    return langSetting;
}

}

我需要在 中设置变量的langSettingindex.html。这将是全局变量,在所有后续页面中,我需要访问langSetting相应语言的值并加载页面。

目前,这就是我尝试js/jsClasses.jsindex.html

<html>
    <script src="js/jsClass.js">
        var object1 = new JSClass();
        object1.setLanguage();
        object1.getLanguage();
    </script>



</html>

当我单击按钮时,什么也没有发生。有人可以帮忙吗?

4

1 回答 1

2

有两种方法可以解决这个问题,一种不好的普通方法和一种好的方法,

不好的是删除var关键字langSetting,使其langSetting成为全局变量。

好的是让 JSClass 返回 langSetting或更广泛地说是一个对象来揭示它,作为一个模块愿意揭示,这被称为揭示模块模式,这是谷歌开发人员 Addy Osmani 的优秀书籍章节

在您的情况下,这是一个很好的解决方案:

var jsClass= function(){


    var langSetting = "en"; // this is javascript's version of a private variable, it is 'closed' in your jsClass

    var getLanguage = function(){
        return langSetting;
    }

    var setLanguage = function(){
        navigator.globalization.getPreferredLanguage(function (language){
            langSetting = language.value; //set the local variable
            console.log(langSetting);
        }, function(){
            console.log("there was an error");
        });
    }
    return {
        getLanguage:getLanguage,
        setLanguage:setLanguage
    };
}

然后在你的代码中你可以做

var obj = new jsClass(); // is exactly the same as var obj = jsClass , when functions return objects it doesn't matter if you use the 'new' keyword
obj.getLanguage(); //returns en

另一种解决方案是使用构造函数模式。有些人认为构造函数模式是实现 Java 开发人员迁移到 javascript 的错误,尽管它在业界和许多库中被广泛使用。这看起来如下:

function JSClass(){ //notice the capital J which though doesn't change execution is a convention indicating a class constructor
    var langSetting;
    this.setLanguage = function(){
        //setter code here
    }
    this.getLanguage = function(){
        //getter code here
    }
}

然后使用new关键字,它看起来像:

var myClass = new JSClass();
myClass.getLanguage();//getter result

另外,请注意我注意到您正在使用 Apache Cordova API 进行全球化,请注意这会使 setLanguage 异步,因此您可能希望它接受 a callback parameter,这意味着您可以在完成时“挂钩”。有关回调以及如何使用它们的更多详细信息,请参阅此 stackoverflow 问题。

于 2013-02-06T22:43:10.373 回答