动态改变功能可以吗?
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;
}
};
当然最后用什么是你的选择。正如我所说,您的方法也很有效,唯一的问题可能是代码清晰度。
我有:
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;
}
};
当然最后用什么是你的选择。正如我所说,您的方法也很有效,唯一的问题可能是代码清晰度。