3

通常,在构造函数中,绑定到函数内的对象在使用前缀this调用时由它返回。new但我想也有可能(我想我什至在 crockford 的书中读过这个)手动返回你自己的值。有没有这样的做法有用的地方?

4

4 回答 4

4

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

IE

if(!TheClass.singleton) TheClass.singleton = this;
return TheClass.singleton
于 2012-11-21T01:13:28.557 回答
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 回答
3

构造函数(即用 调用的函数new)总是返回一个对象,这是this默认值。new在某些情况下,您可能会在不使用 say的情况下防止调用:

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 以查看它是否已存在。如果是这样,那么它将强制返回已经存在的对象,这是我过去实际使用过的东西。

于 2012-11-21T01:20:37.930 回答