我如何用JavaScript创建这个API,并将这些方法分解出来
假设我想用这个API作为示例来做应用程序:我如何用JavaScript创建这个API,并将这些方法分解出来,javascript,design-patterns,api-design,Javascript,Design Patterns,Api Design,假设我想用这个API作为示例来做应用程序: var db = new Database('db-name'); // DB connection var todo = new Todo(db); // New "Todo" and pass it the DB ref // I want this API: todo.model.create('do this', function (data) { console.log(data); }); 我目前有如下设置: function Tod
var db = new Database('db-name'); // DB connection
var todo = new Todo(db); // New "Todo" and pass it the DB ref
// I want this API:
todo.model.create('do this', function (data) {
console.log(data);
});
我目前有如下设置:
function Todo (storage) {
this.storage = storage;
};
Todo.prototype.model = {
create: function (task, callback) {
// The problem is "this" is Todo.model
// I want the "super", or Todo so I can do:
this.storage.save(task, callback);
}
}
因此,如果您看到注释,问题是model.create
中的“this
”显然是引用Todo.model
,但我需要它来获取“super
”
我能想到的最好的办法是:
Todo.prototype.model = function () {
var self = this;
return {
create: function (task, callback) {
// The problem is "this" is Todo.model
// I want the "super", or Todo so I can do:
self.storage.save(task, callback);
}
}
}
但这两个都不是很好。最大的问题是,我不想将所有关于模型的方法都放在单个对象(第一个示例)或函数(第二个)中。我想能够把他们从模型def里面拿出来。其次,我希望使用todo.model.create
API
是否有一种设计模式可以实现这一点?您不能在编写时将原型模式用于todo.model
,因为model
是todo
的属性
我认为你需要:
一个新的模型
对象,您可以在其上使用原型模型
在Todo
构造函数中,创建Model
对象。理想情况下,使用只读的“getter”函数允许访问该模型对象,但不允许覆盖
您可以在构造函数中设置模型
,如以下示例所示:
function Todo (storage) {
var self = this;
this.storage = storage;
this.model = {
create: function(task, callback) {
self.storage.save(task, callback);
}
};
};
或者,您可以使用,但我认为这会不必要地使事情复杂化,因为您必须找到一个在旧浏览器上工作的实现,并且它不会与支持EcmaScript 5的新浏览器中的本机实现冲突。使用bind
,您可以这样做:
function Todo (storage) {
this.storage = storage;
this.model = {};
var methodNames = Object.keys(TodoModel);
for(var i = 0; i < methodNames.length; ++i) {
var methodName = methodNames[i];
var method = TodoModel[methodNames];
model[methodName] = method.bind(this);
}
};
var TodoModel = {
create: function(task, callback) {
// Note that when this method is called using Todo.model.create,
// 'this' will point to the Todo instance.
this.storage.save(task, callback);
}
};
function test(storage) {
var todo = new Todo(storage);
var task = {};
todo.model.create(task, function(err, savedTask) {
// ...
});
}
功能待办事项(存储){
这个.存储=存储;
this.model={};
var methodNames=Object.keys(TodoModel);
对于(变量i=0;i
TodoModel
基本上是一个映射,因此您可以将其替换为一个映射集合,并且不再需要调用对象。键
IE9支持也可以。我不在乎iSeems如何工作,它允许我分解所有的模型方法,并得到我想要的API。好主意。我觉得模型
“类”在空间中是浮动的,因为它不是从任何东西继承来的,也不是附加到任何东西上的,但它是有效的。谢谢谢谢你应该把这个放在你的另一个答案中:)