2016-04-06 52 views
0

私はJSで次のメソッドを呼び出します。ネストされたオブジェクトにこのスコープを継承

app.execute({ 
    first: function() { 
     console.log('executed'); 
     oneMethod(); // function undefined 
     app.oneMethod(); // works 
     this.oneMethod(); // works when I exract app object into this variable 
    }, 
    second: function() { 

    } 
}); 

アプリのオブジェクトは次のようになります。だから、

var app = function() { 
    var oneMethod = function() { 

    };  
    var secondMethod = function() { 

    }; 
    var execute = function(first, second) { 
     var obj = new first(); 
    }; 
    this.oneMethod = oneMethod; 
    this.secondMethod = secondMethod; 
    this.execute = execute; 
}; 

、最初のコードはHTMLに座って、第二外部ライブラリです。私は​​引数の中のその外部ライブラリのメソッドを使って何かをします。私はグローバルな名前空間に矛盾がないようにこれをしたいと思います - ただapp変数があり、そのメソッドは引数オブジェクトでのみ利用できます。

キーワードnewのオブジェクトを作成すると、このオブジェクトを作成する場所と同じように、コンストラクタに同じ名前空間を使用したいと考えています。

これは可能ですか?より良い方法がありますか?

+0

ようES5にES6ソリューションを変換することができ、あなたの現在のコードは動作していますか? –

+0

コンテキストを 'app'に設定するためにbind()を使用します。[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind] – Chris

答えて

1

appはコンストラクタではなく、オブジェクトそのものであることを望んでいません。あなたは簡単に暴露のモジュールパターン(オブジェクト-returing生命維持)を使用して、それを構築することができます。

var app = (function() { 
    function oneMethod() { 
     … 
    } 
    function secondMethod() { 
     … 
    } 
    function execute(first, second) { 
     var obj = new first(); 
    } 
    return { 
     oneMethod: oneMethod, 
     secondMethod: secondMethod, 
     execute: execute 
    }; 
}()); 
0

我々は、名前空間app、バインド方法は、これらのメソッドは、グローバルに漏れないように名前空間にします。私。 methodは、私たちは、そのようなthis.methodであること「そのコンストラクタで同じ名前空間を持っている」ことを願って、app.execute()Firstのインスタンスを作成します(要求#2)

app = { 
    execute(First, Second) {}, 
    method(){} 
}; 

を定義した(要求#1)とapp.method()「作品」されていませんFirstコンストラクタは同じapp.method(要件#3)です。 fiddle

app = { 
    execute(First, Second) { 
    var object = Object.create(app); 
    First.call(object); 
    }, 
    method() {} 
}; 

app.methodたちはES2015以降に導入された "a shorter syntax for method definitions on object initializer" を使用

app = (function() { 
    var secret = 'variable'; 
    return { 
    execute(First, Second) { /*...*/ }, 
    method() { return secret } 
    }; 
}()); 

注意に依存秘密の変数がある場合。 (Thxを、@Bergi) 私たちは、その

app = { 
    execute: function (First, Second) { 
    var object = Object.create(app); 
    First.call(object); 
    }, 
    method: function() {} 
}; 
+0

あなたの答えにES6を使用してください。それに付随するタグは付いていません。そのことについて忘れないようにしてください。 – Bergi

+0

@Bergiはい、 – user943702

関連する問題