gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:16 25 4
gpt4 key购买 nike

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

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

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

var myBook = new Book('A Good Book', '500 pages');

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

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

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

var other = Movie('Gladiator', '180');

我想我想弄清楚的是它们创建对象的方式是否不同?如果是这样,一个比另一个更好吗?是否存在一种比另一种更好的不同情况?

最佳答案

第一个是构造函数,因此可以通过 prototype 进行扩展,您可以通过 instanceof 测试结果是否是该类型的实例。缺点:如果您忘记了 new 关键字,您的代码将会崩溃(除非您为每个 constuctor 编写解决方法)

当你实例化一个新的对象时,你不能真正使用带有构造函数的apply()来传递参数数组;另一方面,不要那样做,即使你可以/可以。

第二个是工厂,不是构造函数。与您是否使用 new 关键字无关。通过这个实现,它创建了看起来相同但不共享类型或原型(prototype)的对象(尽管底层 JS 引擎将它们识别为相似的,因此只要它们具有相同的属性,它们就共享相同的隐藏类,添加到相同的顺序,...不同的主题)
长话短说,性能和内存占用都不会(再)受到这种方法的影响

但是您无法检查它们是否属于同一类型,并且您没有可能影响所有实例(可能是正反两面)的共享原型(prototype)。

如果我需要继承,我的 goto-approach 是两者的混合体:
(如果我只需要一个数据对象,我通常使用工厂和普通对象)。

function Book(conf) {
var book = Object.create(Book.prototype);
//a book like this usually has multiple configs/properties
if(typeof conf === "object"){
for(var k in conf) book[k] = conf[k];
}else if(conf){
//assuming that I get at least the name passed
book.name = String(conf);
}
return book;
}

//I have a prototype that can be extended
//with default-values for example; no idea for a good method
//to add to the prototype in this example ;)
Book.prototype.numPages = 0;

//but I can also use it like a plain function; no error if you
var myBook1 = Book("Peter Pan");
var myBook2 = Book({
name: "American Gods",
author: "Neil Gaiman"
});

如果我将以下行添加到函数的顶部,我还可以将其用作将任何内容转换为 Book 实例的方法,而无需克隆现有实例

function Book(conf) {
//with this simple line I can also use this as a function to cast anything into a "Book"
if(conf instanceof Book) return conf;

var book = Object.create(Book.prototype);
//...
return book;
}

var data = [
"Peter Pan",
{name: "American Gods"},
//...
];

var books = data.map(Book);

在我看来,这种方法对我来说是两全其美。

关于javascript - 使用构造函数创建对象与返回对象有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36413869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com