0

私はしばらくの間 JS のコーディングを行ってきましたが、オブジェクト指向については何もしたことがありません。私は通常、最初にすべての変数を定義してから、それらをすべて使用しました。OO を使用するように何度も聞いていましたが、今では自分のやりたいことができず、助けも得られません。

ここにフィドルと、半同一のコードがあります:

http://jsfiddle.net/zDeAJ/1/

var App = {
    options: {

        /* ------------------------------------
             Options (PREFERABLY DONT CHANGE)
        --------------------------------------- */

        baseDomain     : 'google.com',
        apiVersion     : '/api/v1'

    },
    state: {

        current: App.options.baseDomain + App.options.apiVersion

    }
}

したがって、 App.options.baseDomain (または this.options.baseDomain) を実行してもうまくいきません。それらに基づいて他のアプリケーション レベルの値を定義できない場合、アプリケーション レベルの変数を定義する利点は何ですか? 私はこれが漠然とした質問であることを知っていますが、私が何を求めているのか本当にわかりません...設定だけでなく状態を保持する一連の変数だけで簡単に達成できたことに問題があります私のアプリケーション内では、Javascript OO パターンの知識ではそれほど簡単ではありません....

http://i.imgur.com/ak5YD.png

しかし、私はその制限を認識していませんでした...そのため、この実装に可能な限り近く、エレガントに固執する方法が必要です。

4

5 に答える 5

0

あなたの質問は非常に一般的です。達成しようとしていることをより具体的にする必要があります。

それはさておき、オブジェクトに関するドキュメントを読んでください。

w3schoolsから取得:

JavaScript を使用すると、独自のオブジェクトを定義および作成できます。

新しいオブジェクトを作成するには、次の 2 つの方法があります。

1. Define and create a direct instance of an object.
2. Use a function to define an object, then create new object instances.

方法 1:

personObj=new Object();
personObj.firstname="John";
personObj.lastname="Doe";
personObj.age=50;
personObj.eyecolor="blue";

方法 2:

function person(firstname,lastname,age,eyecolor)
{
    this.firstname=firstname;
    this.lastname=lastname;
    this.age=age;
    this.eyecolor=eyecolor;

    this.changeName=changeName;
    function changeName(name) {
        this.lastname=name;
    }
}
于 2012-09-20T18:46:23.293 に答える
0

次のことができます (JavaScript では、関数はオブジェクトです)。

function App () {
    // Save a reference to the object
    this.options = {
        baseDomain: "google.com",
        apiVersion: "/api/v1"
    };

    this.state = {
        current: this.options.baseDomain + this.options.apiVersion
    };
}

var myApp = new App();
console.log(myApp);
于 2012-09-20T18:41:15.430 に答える
0

JavaScript はインタープリター言語です。つまり、コードが裏返しに評価されるか、最も内側の式が評価されて次の外側の式に渡されます。

あなたの例では、optionsget の値が最初に評価され、次に の値が評価されますstate。問題は、完全に評価される前に の連想配列にアクセスできないことです。Appこれは、 の値の評価中は当てはまりませんstate

EDITED

正しく答えられなくてすみません。2番目の洗練されたアプローチは次のとおりです。

var App = {
    options: {

        /* ------------------------------------
             Options (PREFERABLY DONT CHANGE)
        --------------------------------------- */

        baseDomain     : 'google.com',
        apiVersion     : '/api/v1',
        blah: ''

    },
    blah: function(){

        return App.options.baseDomain + App.options.apiVersion;

    }
}

console.log(App.blah());
于 2012-09-20T18:48:59.447 に答える
0

このアプローチは、App という「インスタンス」オブジェクトを作成するものと考えることができます。

ここでは、少し異なるアプローチを示します。

function App () {
    // Save a reference to the object
    var that = this;

    that.options = {
        baseDomain: "google.com",
        apiVersion: "/api/v1"
    };

    that.state = {
        current: that.options.baseDomain + that.options.apiVersion
    };
}

var myApp = new App();
// Write the current state to the screen
document.write(myApp.state.current);

JSFiddle は次のとおりです: http://jsfiddle.net/zDeAJ/1/

お役に立てれば!

于 2012-09-20T18:38:19.973 に答える
0

あなたの誰も私の質問に答えませんでした....私はそれについて少し考えました...私はそれにアクセスするためにリテラル内の名前付き関数を使用することができました...そして私が望むなら(必要ではありません)私はそれを元に戻すことさえできましたオプション オブジェクトに

http://jsfiddle.net/zDeAJ/9/

var App = {
    options: {

        /* ------------------------------------
             Options (PREFERABLY DONT CHANGE)
        --------------------------------------- */

        baseDomain     : 'google.com',
        apiVersion     : '/api/v1',
        blah: ''

    },
    state: function(){

        this.options.blah = this.options.baseDomain + this.options.apiVersion;

    }
}

App.state();
console.log(App.options.blah);

</p>

于 2012-09-20T19:17:30.813 に答える