gpt4 book ai didi

javascript - 在另一个对象中实例化一个对象

转载 作者:行者123 更新时间:2023-11-30 08:32:49 25 4
gpt4 key购买 nike

有一个对象,比如说 Book,它有其他对象的集合 Page。因此,我根据传递给 Book 的原始数据实例化页面:

function Book(data){
this.pages = [];
var self = this;
data.forEach(function(item){
self.add(item);
});
}

Book.prototype.add = function(data){
this.pages.push(new Page(data));
}


function Page(data){
// some validation code
this.prop = data.prop;
}
Page.prototype...

从关于可测试性的讲座中,我听说在另一个对象中实例化(使用 new)是一种不好的做法。正确的做法是什么?

如果没问题 - 如果我在 add() 方法中实例化一个新的 Page 或已经将其作为对象传递给它(this .add(新页面(数据)))?

最佳答案

问题是当您想为代码编写单元测试时。

让我们举一个实际的例子。一段时间后,您的代码是这样的:

function Book(data){
this.pages = [];
var self = this;
data.forEach(function(item){
self.add(item);
});
}

Book.prototype.add = function(data){
var page = new Page(data);

// Because the page need to know its book
page.book = this;

this.pages.push(page);
}


function Page(data){
// some validation code
this.data = data;
}
Page.prototype...

现在你想为 add 方法编写一个单元测试,并且你想在你的书中添加一个新页面后检查 page.book是书。但是使用这样的代码,你不能这样做。因为页面是在方法内部创建的,所以您无法检查任何内容。

Buf 如果我们像那样重写代码:

Book.prototype.add = function(page){
page.book = this;
this.pages.push(page);
}

我们现在可以编写单元测试了:

describe('book.add', function() {

it('should set the current book in the book property of the page', function() {
var book = new Book(),
page = new Page();

book.add(page);

expect(page.book).toBe(book);
});

});

但是,如果您不想编写任何像这样的单元测试,则没有理由不在 add 方法中创建新页面。

关于javascript - 在另一个对象中实例化一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35316321/

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