关于 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,因为 || 中的第一个值条件是真实的。如果它是假的,那么它只会尝试评估另一部分。
但是,您的 obj
是 not empty
。
第 Object.setPrototypeOf(obj, constructor.prototype);
行在这两种情况下都执行并且 obj 的原型设置为 Person 的原型,因为 spawn 函数中的 constructor
参数只不过是 Person
.
在第一种情况下,由于 return constructor.apply(obj, myArray.slice(1)) || obj
,您使用参数 Douglas
和 Crockford
调用 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
对象本身
我创建了自己的 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,因为 || 中的第一个值条件是真实的。如果它是假的,那么它只会尝试评估另一部分。
但是,您的 obj
是 not empty
。
第 Object.setPrototypeOf(obj, constructor.prototype);
行在这两种情况下都执行并且 obj 的原型设置为 Person 的原型,因为 spawn 函数中的 constructor
参数只不过是 Person
.
在第一种情况下,由于 return constructor.apply(obj, myArray.slice(1)) || obj
,您使用参数 Douglas
和 Crockford
调用 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()
.
obj
对象本身