通常,在构造函数中,当使用this
前缀调用时,函数中绑定到new
的对象将返回该对象。但我想,也可以(我想我甚至在crockford的书中读过这篇文章)手动返回你自己的价值。有没有这种做法有用的地方?
答案 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以查看它是否已存在。如果确实如此,那么它将强制返回已经存在的对象,这是我过去实际使用的对象。