Node.js:如何从抽象类“inheritance”?

我正在用node.js(+ angular等)构build一个web应用程序。
应用程序将不得不从不同的提供商那里获取一些数据(类似于商品目录列表),他们以不同的方式公开他们的数据。

在这个模块中,我将对所有提供者都有一些共同的function,以及其中任何一个独特的function。

我目前(不好)的实现是这样的:

var providers = [ { name: 'Apple', /* ... */ }, { name: 'Samsung', /* ... */ }, { name: 'Google', /* ... */ }, ]; exports.syncCatalogues = function(search, callback) { var allItems = []; for (var p = 0; p < providers.length; p++) { exports.getCatalog(providers[p], function(err, catalog) { if (err) { return callback(err); } exports.getItems(providers[p], catalog, function(err, items) { if (err) { return callback(err); } allItems = allItems.concat(items); callback(null); }); }); } }; 

而我的getCatalog()和getItems()的实现是这样丑陋:

 exports.getCatalog(provider, callback) { if (provider.name === 'Apple') { // code for Apple provider ... } // and so on ... }; exports.getItems(provider, callback) { if (provider.name === 'Apple') { // code for Apple catalog ... } // and so on ... }; 

我知道用ES5(我坚持它)抽象类不容易实现,但我相信有一个更好的方法(代码更可读,可维护,可testing)比这个… 🙁

有很多方法可以在JavaScript中实现inheritance。 这里是我认为最简单的一个,因为你只是使用普通对象进行操作并使用原型inheritance。

而不是基类,你有一个原型对象,你可以放置通用的代码。 然后根据原型创build一个对象并添加特定的代码。

 var providerPrototype = { name: 'Prototype', alertName: function() { // this is common function, all objects alert(this.name); // will have it } }; var appleProvider = Object.create(providerPrototype); appleProvider.name = 'Apple'; // this is a specific function for 'Apple' appleProvider.getCatalog = function(callback) { return callback(null, ['iPhone', 'Mac Mini']); } appleProvider.alertName = function() { // call 'base' method providerPrototype.alertName.call(this); alert('All rights reserved.'); } var samsungProvider = Object.create(providerPrototype); samsungProvider.name = 'Samsung'; // this is a specific function for 'Samsung' samsungProvider.getCatalog = function(callback) { return callback(null, ['Galaxy S3', 'Galaxy S4']); } var providers = [ appleProvider, samsungProvider ]; var syncCatalogues = function(search, callback) { var allItems = []; for (var p = 0; p < providers.length; p++) { var aProvider = providers[p]; aProvider.getCatalog(function(err, catalog) { if (err) { return callback(err); } aProvider.alertName(); // call the base method alert(catalog); }); } }; syncCatalogues(); 

我的回应是一个可能的替代scheme。

我个人不喜欢原生的JavaScript对象mecanics。 所以我通常使用像Mootools这样的库来制作干净的对象。

来自Mootools文档的示例:

 var Animal = new Class({ initialize: function(age){ this.age = age; } }); var Cat = new Class({ Extends: Animal, initialize: function(name, age){ this.parent(age); // calls initalize method of Animal class this.name = name; } }); var myCat = new Cat('Micia', 20); alert(myCat.name); // alerts 'Micia'. alert(myCat.age); // alerts 20. 

在线文档: http : //mootools.net/

我在nodeJS是新的,但我认为我的代码只能在ES6之后。 我希望能帮助像我这样的新手。 具体情况如下:

 class BaseClass { constructor(){ console.log('Object created INHERITED'); } toCallFromChild(){ console.log('Called by child'); this.toOverride(); } toOverride(){} //to override } class childClass extends BaseClass{ toOverride(){ console.log ('Override by child'); } } var instance = new childClass(); instance.toCallFromChild();