3

通常、コンストラクター関数では、関数内でバインドされているオブジェクトは、プレフィックスthisを付けて呼び出されたときに返されます。newしかし、手動で自分の値を返すことも可能だと思います(私はこれをクロックフォードの本で読んだと思います)。そのような練習が役立つ場所はありますか?

4

4 に答える 4

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まったく異なるものが返されます。

于 2012-11-21T01:28:06.773 に答える
4

シングルトンパターンを実装したい場合は、これを使用できます。最初にオブジェクトを作成した後は、別のオブジェクトを作成しないでください。代わりに、最初に作成したオブジェクトを返します。

すなわち

if(!TheClass.singleton) TheClass.singleton = this;
return TheClass.singleton
于 2012-11-21T01:13:28.557 に答える
3

コンストラクター(つまり、で呼び出される関数new)は、常にオブジェクトを返します。これがthisデフォルトです。newたとえば、次のように使用せずに通話から保護できる場合があります。

function Foo(arg) {
  if ( !(this instanceof Foo) ) {
    return new Foo(arg);
  }
  this.blah = arg;
}

したがって、関数のに別のオブジェクトをthis返しますが、それでもそれ自体のインスタンスを返します。

于 2012-11-21T01:27:42.623 に答える
2

ええ、このように考えてください。

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がすでに存在するかどうかを確認します。もしそうなら、それは私が過去に実際に使用したものである、すでに存在するオブジェクトの返還を強制します。

于 2012-11-21T01:20:37.930 に答える