这来自underscore.js的函数“_”

时间:2013-04-15 17:43:35

标签: javascript constructor underscore.js

我试图找出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);

这里的'这个'是什么?为什么证明安全。如果得到的话就是创造自己的对象?那是递归吗?

1 个答案:

答案 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
    }
}