JavaScript:构建新实例的方法

Jef*_*eff 1 javascript constructor

根据这篇MSDN文章 - 滚动到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?
Run Code Online (Sandbox Code Playgroud)

但是,虽然第一个示例(构建新对象的最常见方式)返回预期的实例,但第二个示例返回undefined- 我做错了吗?

这是我用来测试的JSFiddle:http://jsfiddle.net/wk8JD/1/

Fel*_*ing 7

更改

dog = Dog.call(dog,"Rowdie");
Run Code Online (Sandbox Code Playgroud)

Dog.call(dog,"Rowdie");
Run Code Online (Sandbox Code Playgroud)

当你用函数调用函数时new,this隐式返回,即函数的行为就像你return this;最后一样.从MDN文档:

构造函数返回的对象成为整个new表达式的结果.如果构造函数未显式返回对象,则使用在步骤1中创建的对象.(通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做.)

但是如果你"正常"调用一个函数(即没有new),undefined如果没有return语句,它将返回.

(在文章中他们没有给btw分配返回值)