gpt4 book ai didi

javascript - this 在 underscore.js 的函数 "_"中

转载 作者:行者123 更新时间:2023-12-02 18:49:11 25 4
gpt4 key购买 nike

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

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

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

this._wrapped = obj;

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

其他问题:

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

这里的“这个”是什么?为什么这被证明是安全的。如果成立的话,是不是自己创建了对象?这是类似递归的东西吗?

最佳答案

在 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;

这里我们进入第二部分:我们如何才能真正理解函数是否被作为构造函数调用?使用上面提到的 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
}
}

关于javascript - this 在 underscore.js 的函数 "_"中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com