Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何用JavaScript创建这个API,并将这些方法分解出来_Javascript_Design Patterns_Api Design - Fatal编程技术网

我如何用JavaScript创建这个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

假设我想用这个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 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。好主意。我觉得
    模型
    “类”在空间中是浮动的,因为它不是从任何东西继承来的,也不是附加到任何东西上的,但它是有效的。谢谢谢谢你应该把这个放在你的另一个答案中:)