通常、コンストラクター関数では、関数内でバインドされているオブジェクトは、プレフィックスthis
を付けて呼び出されたときに返されます。new
しかし、手動で自分の値を返すことも可能だと思います(私はこれをクロックフォードの本で読んだと思います)。そのような練習が役立つ場所はありますか?
4 に答える
コンストラクターから値型を返す場合、使用されたかどうかによって異なる動作が得new
られます。それがどのように機能するかString
です。JavaScriptコンソールでこのオブジェクトを見てください。
{
s: String("abc"),
S: new String("abc")
}
Littles
には文字列値が含まれますが、bigS
には文字列Objectが含まれます。微妙な違いかもしれません。
それをはるかに超えて、同じ関数をさまざまな目的に使用することができます。
function Foo() {
return "abc";
}
Foo.prototype.DoSomething = function () {
// something completely unrelated to "abc"
};
var a = Foo(); // The string "abc". Does not have a DoSomething() method.
var b = new Foo(); // An Object with a DoSomething() method. Doesn't know about "abc".
使用したかどうかによって、new
まったく異なるものが返されます。
シングルトンパターンを実装したい場合は、これを使用できます。最初にオブジェクトを作成した後は、別のオブジェクトを作成しないでください。代わりに、最初に作成したオブジェクトを返します。
すなわち
if(!TheClass.singleton) TheClass.singleton = this;
return TheClass.singleton
コンストラクター(つまり、で呼び出される関数new
)は、常にオブジェクトを返します。これがthis
デフォルトです。new
たとえば、次のように使用せずに通話から保護できる場合があります。
function Foo(arg) {
if ( !(this instanceof Foo) ) {
return new Foo(arg);
}
this.blah = arg;
}
したがって、関数のに別のオブジェクトをthis
返しますが、それでもそれ自体のインスタンスを返します。
ええ、このように考えてください。
item = function(id){
if(alreadytaken(id)){
return cache[id];
}else{
cache[id] = this;
}
}
var newitem = new item(1);
var newitem2 = new item(1);
この例では、IDをチェックして、IDがすでに存在するかどうかを確認します。もしそうなら、それは私が過去に実際に使用したものである、すでに存在するオブジェクトの返還を強制します。