有没有理由在构造函数中手动`return`?

时间:2012-11-21 01:10:18

标签: javascript oop compiler-construction return new-operator

通常,在构造函数中,当使用this前缀调用时,函数中绑定到new的对象将返回该对象。但我想,也可以(我想我甚至在crockford的书中读过这篇文章)手动返回你自己的价值。有没有这种做法有用的地方?

4 个答案:

答案 0 :(得分:4)

如果你想实现一个单例模式,可以使用它,通过确保在第一次构造对象之后你永远不会构造另一个对象 - 而是返回第一个构造的对象。

if(!TheClass.singleton) TheClass.singleton = this;
return TheClass.singleton

答案 1 :(得分:4)

如果从构造函数返回值类型,则会根据是否使用new获得不同的行为。这就是String的工作原理。在JavaScript控制台中查看此对象:

{
    s: String("abc"),
    S: new String("abc")
}

Little s包含字符串值,但是大S包含字符串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,你会得到完全不同的东西。

答案 2 :(得分:3)

构造函数(即使用new调用的函数)始终返回一个对象,this是默认对象。在某些情况下,如果没有new使用say:

,您可以防止来电
function Foo(arg) {
  if ( !(this instanceof Foo) ) {
    return new Foo(arg);
  }
  this.blah = arg;
}

所以你将一个不同的对象返回给函数this,但它仍然返回一个自己的实例。

答案 3 :(得分: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以查看它是否已存在。如果确实如此,那么它将强制返回已经存在的对象,这是我过去实际使用的对象。