我试图找出underscore.js代码,我在开始时遇到问题。 此代码段被描述为“创建对Underscore对象的安全引用,以供下面使用。”
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
};
我不明白。这是一个简单的函数或构造函数吗?乍一看它有:
this._wrapped = obj;
所以它是构造函数,但是它有两个带有return的'ifs',所以当if if得到false时它是一个构造函数,当ifs之一得到true值时是函数吗?
其他问题:
if (!(this instanceof _)) return new _(obj);
这里的'这个'是什么?为什么证明安全。如果得到的话就是创造自己的对象?那是递归吗?
答案 0 :(得分:2)
在JavaScript函数中用作构造函数。使用new
运算符时,任何函数都可以用作构造函数。以一个简单的sum
函数为例:
function sum(a, b) {
return a + b;
}
var x = new sum(10, 2);
console.log(x); // object
console.log(x instanceof sum); // true;
在这里我们进入第二部分:我们如何真正理解function
是否被称为构造函数?使用您在上面提到的第this instanceof
行。基本上是:
function sum(a, b) {
if (this instanceof sum) {
this.result = a + b;
} else {
return a + b;
}
}
如果函数被称为构造函数,则上下文对象this
指向刚刚创建的新对象。
此技术还用于在某些库中使用new
- 免费语法,与您发布的代码类似,因此new
是可选的:
var panel = Panel();
在内部,他们只需检查this
:
function Panel() {
if (this instanceof Panel) {
return this; // `new` operator was used
} else {
return new Panel(); // called without `new`, so we create a new object
}
}