根据this MSDN article - 滚动到Constructor Functions but No Classes
,(并在阅读MDN JS引用后)我应该能够构建这样的对象:
function Dog(name){
this.name = name;
}
// EXAMPLE 1
var dog = new Dog("Spot");
console.log("Dog using new:");
console.log(dog); // Dog object, awesome!
// EXAMPLE 2
var dog = {};
dog = Dog.call(dog,"Rowdie");
console.log("Dog using call:");
console.log(dog); // Undefined.. why?
然而,虽然第一个示例(构建新对象的最常见方式)返回预期的实例,但第二个示例返回undefined
- 我做错了吗?
以下是我用来测试它的JSFiddle:http://jsfiddle.net/wk8JD/1/
答案 0 :(得分:7)
更改
dog = Dog.call(dog,"Rowdie");
到
Dog.call(dog,"Rowdie");
当您使用new
调用某个函数时,this
隐式返回,即该函数的行为就像您最后有return this;
一样。来自MDN documentation:
构造函数返回的对象成为整个
new
表达式的结果。如果构造函数未显式返回对象,则使用在步骤1中创建的对象。 (通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做。)
但是如果你“正常”调用一个函数(即没有new
),如果没有undefined
语句,它将返回return
。
(在文章中他们没有给btw指定返回值)