0

我正在尝试编写 underscore.js 代码,但我一开始就有问题。此代码段被描述为“创建对 Underscore 对象的安全引用以供以下使用。”

 var _ = function(obj) {
   if (obj instanceof _) return obj;
   if (!(this instanceof _)) return new _(obj);
   this._wrapped = obj;
 };

我不明白。那是一个简单的函数还是构造函数?乍一看,它有:

this._wrapped = obj;

所以它是构造函数,但它有两个带有返回的“ifs”,那么当 if 为 false 时是构造函数,而当 ifs 中的一个为 true 时,它​​是函数吗?

还有其他问题:

if (!(this instanceof _)) return new _(obj);

这里的“这个”是什么?为什么这被证明是安全的。如果那是真的,那是创造自己的对象吗?这像递归吗?

4

1 回答 1

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;

现在我们进入第二部分:我们如何才能真正理解 afunction是否被称为构造函数?使用this instanceof您上面提到的行。基本上:

function sum(a, b) {
    if (this instanceof sum) {
        this.result = a + b;
    } else {
        return a + b;
    }
}

如果一个函数被调用为构造函数,上下文对象this指向刚刚创建的新对象。

此技术也用于new在某些库中具有 -free 语法,与您发布的代码类似,因此这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
    }
}
于 2013-04-15T18:41:38.527 回答