使用构造函数创建对象与返回对象有区别吗?

mht*_*n86 5 javascript constructor javascript-objects function-constructor

这些功能的操作方式有什么不同吗?第一个更典型的是我在考虑构造函数时所想到的。

示例1:使用来命名和设置属性。然后使用new创建一个新的Book对象。

    function Book(name, numPages) {
        this.name = name;
        this.numPages = numPages;
    }

    var myBook = new Book('A Good Book', '500 pages');
Run Code Online (Sandbox Code Playgroud)

示例 2:使用new返回一个对象并仅调用函数本身。

    function Movie(name, numMinutes) {
        return { name:name, numMinutes:numMinutes };
    }

    var best = new Movie('Forrest Gump', '150');

    var other = Movie('Gladiator', '180');
Run Code Online (Sandbox Code Playgroud)

我想我想弄清楚的是它们创建对象的方式是否不同?如果是这样,一个比另一个更好吗?是否有不同的情况下,其中一种会比另一种表现得更好?

Mik*_*uck 0

基本上,当您使用 时new,JS 引擎会为您创建一个全新的对象,并将其作为 的值注入this。它还会自动为您提供附加到构造函数原型的任何方法。使用构造函数还可以让您更轻松地检查对象是否是某个instanceof对象。

function MovieA(title) {
    this.title = title;
}
MovieA.prototype.getTitle = function() {
    return this.title;
};

function MovieB(title) {
    return {
    title: title
  };
}
MovieB.prototype.getTitle = function() {
    return this.title;
};

var a = new MovieA('A');
console.log(a instanceof MovieA); // true
console.log(a.getTitle()); // 'A'

var b = MovieB('B');
console.log(b instanceof MovieB); // false
console.log(b.getTitle()); // Uncaught TypeError: b.getTitle is not a function
Run Code Online (Sandbox Code Playgroud)

为您提供的一切都new可以通过其他方法获得,但需要更多的体力劳动。

第二种方法,工厂,往往更适合单元测试、自定义对象创建和函数式编程。它更适合单元测试,因为如果您有一个生产所有对象的工厂,您只需用模型替换该工厂即可测试不同的情况。

var Factory = {
  makeThing: function() {
    return { name: 'thing' };
  }
};

// Want to test the case for if makeThing fails inside of some other code
var MockFactory = {
  makeThing: function() {
    return null;
  };
};
Run Code Online (Sandbox Code Playgroud)

至于什么时候使用,这完全取决于。new有些人根本不使用。其他人专门使用new。这一切都取决于您是否需要上面列出的任何东西、您需要对对象的创建进行多少控制、您何时想要使用this或不使用等等。最后,这都是一个偏好问题。