gpt4 book ai didi

Node.js:如何从抽象类中获取 'inherit'?

转载 作者:搜寻专家 更新时间:2023-10-31 22:40:52 25 4
gpt4 key购买 nike

我正在使用 node.js(+ angular 等)构建一个网络应用程序。
该应用程序必须从不同的提供者那里检索一些数据(例如目录项列表),这些提供者以不同的方式公开他们的数据。

在该模块中,我将拥有所有提供者共有的一些功能,以及其中任何一个提供者独有的一些功能。

我当前(糟糕的)实现是这样的:

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(我坚持使用它)抽象类不容易实现,但我确信有比这更好的方法(代码更具可读性、可维护性、可测试性)... :-(

最佳答案

在 JavaScript 中实现继承的方式有很多种。这是一个我认为最简单的方法,因为您只需操作普通对象并使用原型(prototype)继承。

你有一个原型(prototype)对象而不是基类,你可以在其中放置通用代码。然后根据原型(prototype)创建一个对象并向其添加特定代码。

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();

同时检查 Inheritance and the prototype chain在 Mozilla javascript 文档中。

这里是 an example of splitting classes over node.js modules .

关于Node.js:如何从抽象类中获取 'inherit'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35319739/

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