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)
我想我想弄清楚的是它们创建对象的方式是否不同?如果是这样,一个比另一个更好吗?是否有不同的情况下,其中一种会比另一种表现得更好?
基本上,当您使用 时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
或不使用等等。最后,这都是一个偏好问题。