【发布时间】:2016-08-29 15:11:22
【问题描述】:
我正在努力掌握如何在 JavaScript 中创建“静态”对象类型(我怀疑我的措辞是否正确......)。
在下面的代码中,我试图创建一个 jQuery 插件(不过我怀疑这无关紧要),它创建了多个 CrmQuery,每个都有自己的上下文信息作为 instance 传递。我还想为所有CrmQuery 使用创建一个“静态”对象(它可以是无状态的),并希望将它包含在CrmQuery 命名空间中。
这是我的结构,但是在调用CrmQuery.searchOperator[instance.Operator].buildCondition(instance.fieldName, searchTerm)时,buildCondition函数无法访问CrmQuery.searchOperator中的oDataOperator函数。我尝试过以多种方式引用它,而不仅仅是searchOperator.oDataOperator,而this 是对实际属性的引用,而不是CrmQuery.searchOperator。
结构:
(function($) {
...
var crmQuery = new CrmQuery(instance);
var data = crmQuery.searchCrm(searchTerm);
...
var CrmQuery = function(instance) {
...
this.oDataUrl = function() {
...
oDataFilter += CrmQuery.searchOperator[instance.Operator].buildCondition(instance.fieldName, searchTerm);
...
return oDataFilter;
}();
this.searchCrm(searchTerm) {
...
url += this.oDataUrl;
}
...
}
CrmQuery.searchOperator = {
oDataFunctionOperator: function oDataFunctionOperator(fieldName, searchTerm, operator) {
return operator + "(" + fieldName + ", '" + searchTerm + "')";
},
oDataOperator: function oDataOperator(fieldName, searchTerm, operator) {
return fieldName + " " + operator + " '" + searchTerm +"'";
},
STARTSWITH: {
operator: "startswith",
buildCondition: function(fieldName, searchTerm) {
return this.oDataFunctionOperator(fieldName, searchTerm, this.operator)
}
},
ENDSWITH: {
operator: "endswith",
buildCondition: function(fieldName, searchTerm) {
return searchOperator.oDataFunctionOperator(fieldName, searchTerm, this.operator)
}
},
CONTAINS: {
operator: "substringof",
buildCondition: function(fieldName, searchTerm) {
return searchOperator.oDataFunctionOperator(fieldName, searchTerm, this.operator)
}
},
EXACTMATCH: {
operator: "eq",
buildCondition: function(fieldName, searchTerm) {
return searchOperator.oDataOperator(fieldName, searchTerm, this.operator)
}
},
toString: function () {
var thisVar = this;
var output = "searchOperator enum. ";
output += $.map(Object.keys(this), function (i) {
if (typeof thisVar[i] !== "function")
return i + ": " + thisVar[i].operator;
}).join(", ");
return output;
}
}
...
}(jQuery));
在 JavaScript 中实现这样的模式的正确方法是什么?
我希望这是有道理的?抱歉,如果它过于冗长,但我不想遗漏任何可能很重要的内容。
非常感谢, 詹姆斯
【问题讨论】:
标签: javascript design-patterns properties scope static