关于 return 关键字

Concerning the return keyword

我创建了自己的 new 函数,它创建了一个对象并 return 将其

function Person(firstName, lastName) {
    this.firstName = firstName
    this.lastName = lastName
}

Person.prototype.getName = function () {
    console.log(this.firstName + " " + this.lastName)
}

function spawn(constructor) {
    var obj = {}
    Object.setPrototypeOf(obj, constructor.prototype);
    var myArray = Array.prototype.slice.apply(arguments)
    return constructor.apply(obj, myArray.slice(1)) || obj

}

var crockford = spawn(Person, "Douglas", "Crockford")
crockford.getName()

问题是当我这样设置 return 时:

return constructor.apply(obj, myArray.slice(1)) || obj 它有效,但是当我像下面这样设置 return 时:

return obj || constructor.apply(obj, myArray.slice(1)) 它说未定义

这两者有什么区别?

当您设置 obj || constructor.apply(obj, myArray.slice(1)) 时,值 returned 是 obj,因为 || 中的第一个值条件是真实的。如果它是假的,那么它只会尝试评估另一部分。

但是,您的 objnot empty

Object.setPrototypeOf(obj, constructor.prototype); 行在这两种情况下都执行并且 obj 的原型设置为 Person 的原型,因为 spawn 函数中的 constructor 参数只不过是 Person.

在第一种情况下,由于 return constructor.apply(obj, myArray.slice(1)) || obj,您使用参数 DouglasCrockford 调用 Person 函数,但在第二种情况下,您甚至不调用构造函数函数。

因此,无法将 firstName 和 lastName 属性附加到 this 对象。

由于缺少 firstName 和 lastName 值,您会看到 undefined undefined,而在第一种情况下,由于调用构造函数,您会看到 Douglas Crockford。

明确return constructor.apply(obj, myArray.slice(1)) || obj将return第二部分||因为 constructor.apply(obj, myArray.slice(1)) 将 return 未定义。由于 apply().

,属性 firstName 和 lastName 将附加到 obj 对象本身