0

js/jsClasses.jsファイルに相対的な名前のJavaScriptファイルがありindex.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;
}

}

langSettingで変数の値を設定する必要がありますindex.html。これはグローバル変数になり、後続のすべてのページで、の値にアクセスlangSettingし、対応する言語でページをロードする必要があります。

現時点では、これが私がjs/jsClasses.jsファイルにアクセスしようとしている方法ですindex.html

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



</html>

ボタンをクリックしても何も起こりません。誰か助けてくれませんか?

4

1 に答える 1

2

これを解決するには、よくある悪い方法と良い方法の 2 つの方法があります。

悪いのは、それをグローバル変数にするvarキーワードを削除することです。langSettinglangSetting

良いのは、JSClass が langSetting何を明らかにするか、より広くオブジェクトを返すようにすることです。これは、モジュールが明らかにしようとしているときに、明らかにするモジュール パターンと呼ばれます。これは、Google 開発者の 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

別の解決策は、コンストラクタ パターンを使用することです。コンストラクター パターンは、業界や多くのライブラリで広く使用されていますが、javascript に移行する Java 開発者を実装するために犯した間違いであると考える人もいます。これは次のようになります。

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 を非同期にすることに注意してください。そのため、callback parameter完了時に「フック」することを意味する a を受け入れるようにしたい場合があります。コールバックとその使用方法の詳細については、このスタックオーバーフローの質問を参照してください。

于 2013-02-06T22:43:10.373 に答える