在module.exports中新增的目的是什么?

我有一个testing分为3个部分。 主页面对象页面,页面有问题的HomePage和testing本身。

我想要HomePage来扩展Page对象。 但是我发现的是 – 如果在页面类中我使用:

module.exports = new Page()

我得到错误ERROR: Class extends value #<Page> is not a function or null

但是,如果我使用

module.exports = Page

它完美的作品。

有人可以解释为什么这样吗? 这是因为页面对象本身只是与每个页面的父页面,例如HomePageLoginPage或任何其他页面构造?

 class Page { constructor() { this.title = 'My Page'; } open(path) { browser.url('/' + path); } } module.exports = Page; 

==

 var Page = require('../page-models/Page'); class HomePage extends Page { get username() { return browser.element('#username'); } open() { super.open(''); } } module.exports = new HomePage(); 

==testing本身

 var HomePage = require('../page-models/home.page'); describe('Something great', function(){ it('tests this', function(){ HomePage.open(); ... 

任何帮助赞赏。 ps使用nodejs,webdriverio,mocha和chai。

当你写:

 var Page = require('../page-models/Page'); 

variablesPage是您从“../page-models/Page”与module.exports导出的任何module.exports 。 如果你导出一个new Page()对象,那么你的variablesPage将是你创build的Page类的那个实例,而不是这个类本身。 而且你不能extend一个实例。 另外, require()caching结果,所以你总是得到相同的对象。

就像你使用module.exports = Page导出类一样,任何人require可以自由地创build他们自己的实例。

我知道你没有问,但有一点要考虑的是创build一个统一的界面与你的类。 如果您要导出Page类并要求用户实例化或扩展该类,则应该考虑对Homepage执行相同的操作。 也许你可能想要做一些事情:

 var Homepage = require('../page-models/home.'); class MobileHomePage extends Homepage { //... } 

你不能这样做,你用new HomePage()导出一个实例。 这意味着你将需要在你的testing中创build实例,如下所示:

 var HomePageClass = require('../page-models/home.page'); var Homepage = new HomePageClass() 

这是更详细的,但也使您的模块更灵活。