2017-11-15 10 views
1

インスタンスを作成するコンストラクタを使用できますが、呼び出されたときに特定の関数を実行できますか?Javascript:関数のようなオブジェクトを呼び出す

var Foo = function(){ 
    this.bar= "some variable"; 

    this.invokeFunction = function(){ 
     return this.bar; 
    } 
    return .... // what to do here 
}; 

var foo = new Foo(); 

return foo;  // return the instance of Foo: { bar: "some variable" } 
return foo.bar; // returns "some variable" 
return foo() ; // returns "some variable" 
+0

を。 'foo()'は関数ではないのでエラーを投げます。 –

+0

'new'の有無にかかわらず呼び出されるときの動作が異なるように求めていますか? –

答えて

1

このようなもので偽装することができます。 Fooはそれ自身のプロトタイプを指す__proto__を持つ関数を返します。返される関数は、呼び出し可能ですFooのインスタンスとインスタンスのプロパティへのアクセスがあります:あなたが何かを返す必要はありません

var Foo = function(){ 
 
    function inner(){ 
 
     console.log("called") 
 
     return "returned" 
 
    } 
 

 
    inner.__proto__ = Foo.prototype 
 
    inner.bar= "some variable"; 
 
    return inner 
 
}; 
 

 
Foo.prototype.someFn = function(){ 
 
    console.log("called prototype function") 
 
    return this.bar 
 
} 
 

 
var foo = new Foo(); 
 

 
console.log(foo instanceof Foo) // it's an instance of Foo 
 
console.log(foo.bar) // still has access to instance variables 
 
console.log(foo()) // callable! 
 
console.log(foo.someFn()) // prototype function with `this`

0

あなたのクラス関数では、あなたが望むものを返す関数を返します。だからこのようなもの:

var Foo = function(){ 
    this.bar= "some variable"; 

    this.invokeFunction = function(){ 
     return this.bar; 
    } 
    return this.invokeFunction.bind(this); 
}; 
+0

それがうまくいけば、あなたは答えを受け入れるならば、私は大好きです:) – wilsonhobbs

+1

これは実際には動作しません: 'var f = new Foo(); console.log(f.bar) '--->は未定義です。 –

関連する問題