2011-02-05 12 views
5

これは、作業コードです:JavaScriptの機能のサブ機能/変数を持つ

var test = function() 
{ 
    console.log(test.data); 
}; 

test.data = 'hello'; 

test.set = function (data) 
{ 
    test.data = data; 
}; 

test.set('Test'); 
test(); 

これは私のJavaScriptコンソールにTestを出力します。 これを使ってやる方法があれば、私は疑問に思っていましたか?

var test = { 
    this: function() 
    { 
     console.log(test.data); 
    }, 

    data: 'hello', 

    set: function (data) 
    { 
     test.data = data; 
    } 
}; 
+1

関数はオブジェクトですが、オブジェクトは関数ではありません。もちろん、オブジェクトのプロパティとして関数を格納することはできますが、単純なオブジェクトを "呼び出し可能"にすることはできません。または、実際に何を達成したいのですか?あなたの2番目のアプローチの利点は何ですか? –

+0

私はfunction test.this()をtest()を使って呼びたいと思っています。 – Ragnis

+0

@Felixポイントを逃していると思います。私は彼がすべての情報をカプセル化しようとしていると思っています。 – xil3

答えて

5

私のコメントで書いたように、オブジェクトを「呼び出し可能」にすることはできません。

function extend(func, props) { 
    for(var prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      func[prop] = props[prop]; 
     } 
    } 
    return func; 
} 

をし、その後でそれを呼び出す:あなたはしかし、あなたの最初の例からプロセスを自動化することができた

var test = extend(function(){ 
    console.log(test.data); 
}, 
{ 
    data: 'hello',  
    set: function (data) { 
     this.data = data; // note that I changed it to `this.data` 
    } 
}); 

DEMO


、私はあなたのような機能を使用してはならないと思いますそれ。 「通常の」オブジェクトを持っていて、すべてのメソッドをobj.method()で呼び出すのはobj()ではなく、分かりやすいでしょう。

少なくとも、これは非常に慎重に文書化する必要があります。

+0

'hasOwnProperty'呼び出しはどこにありますか? ;) –

+0

@Ivo Wetzel:まあ、とにかく普通のオブジェクトだけを渡すと仮定していましたが...はい、... Object.prototype'の拡張子... bla bla ...(私はいつか彼らが組み込みを願っていますプロトタイプ**拡張不可!)...固定:) –

+0

それは素晴らしいことですが、私は彼らがこれを行うことは疑う: –

0

オブジェクトのプロパティの下に任意の機能を保存できます。そして、あなたはそれらを呼び出すことができます:

let f = { fun1: function() 
       { 
        return 1; 
       } 
     }; 
f.fun1(); 

は完全に動作します。私はそれがキーワードであるのでプロパティ名として 'this'を使用できるかどうかはわかりません。おそらくそれに問題はないが、それは誤解を招くかもしれない。

function Test() { 
    this.data = 'hello'; 
    this.set = function (data) 
    { 
     test.data = data; 
    } 
    this.log = function() 
    { 
     console.log(test.data); 
    } 
} 

var test = new Test(); 
test.set('Test'); 
test.log(); 

これは、あなたが簡単に新しいインスタンスを作成することができるという利点があります。このような何かをすることについてどのように

+0

実際には、2番目の例は擬似コードに似ていました。 – Ragnis

2


あなただけのワンオフをしたい場合、私はあなた自身の提案はあなたが望むほとんどだと思います。

var test = { 
    log: function() 
    { 
     console.log(test.data); 
    }, 

    data: 'hello', 

    set: function (data) 
    { 
     test.data = data; 
    } 
}; 

test.set('Test'); 
test.log(); 

しかし、おそらくあなたの質問には「.logに」の部分を避けるために、どのようでしたか?

+0

はい、私はその ".log"部分を避けたいと思います。 – Ragnis

+0

ログを基本的にコンストラクタに入れたいのですか? – xil3