动态改变功能可以吗?

Is it ok to dynamically change function?

我有:

var diagram = {
  init: function(name) {
    this._name = name;
  },

  update: function(params) {
    var selector = 'diagram_name_' + this._name;

    this.update = function(params) {
      app.updateBlock(selector, params);
    };

    this.updateDiagram(params);
  };

diagram.update(); // caches `selector`
diagram.update(); // uses cached `selector`

diagram 对象有方法 update。此方法使用 selector 变量。第一次调用 update(),我缓存这个变量并更改 update 方法,所以下次调用它时,这个方法将使用缓存的 selector.

我想知道这种方法在性能方面是否可行(以及是否完全可行)。有什么想法吗?

P.S.

我知道我可以创建私有字段 _selector 并在 init 方法期间执行 this._selector = 'diagram_name_' + name,但是这种方法创建的私有字段仅供一种方法使用,感觉不对.

更好的方法可能是在对象上缓存选择器:

this._selector || (this._selector = "value");

这样一来,魔术就更少了,您仍然可以访问所有旧数据,而不是让它消失。

您可能还想了解一下被称为 memoization 的技术,该技术已经解决了很多次(以避免必须自己解决)。

是的,没关系。它被称为Self-Defining Functions。在 Stoyan Stefanov 的精彩著作 "JavaScript Patterns" 中也描述了该模式。

无需担心性能,update 方法也会按预期方式运行。所以从技术上讲,这种模式是可行的。

但是,我觉得它很混乱。当然,当谈到代码清晰度时,事情总是有点主观,但这是我的建议:

方法一

将两种情况完全分开,并确保外部代码在调用 update 之前先调用 updateDiagram:

var diagram = {
    init: function(name) {
        this._name = name;
    },

    update: function(params) {
        var selector = 'diagram_name_' + this._name;
        app.updateBlock(selector, params);
    },

    updateDiagram: function(params) {
        //...
    }
};

方法二

使用参数说明应该使用哪种情况:

var diagram = {
    init: function(name) {
        this._name = name;
        this._diagramUpToDate = false;
    },

    update: function(params) {
        if (this._diagramUpToDate) {
            var selector = 'diagram_name_' + this._name;
            app.updateBlock(selector, params);
        } else {
            this.updateDiagram(params);
        }
    },

    updateDiagram: function(params) {
        //...
        this.diagramUpToDate = true;
    }
};

当然最后用什么是你的选择。正如我所说,您的方法也很有效,唯一的问题可能是代码清晰度。