static"的正确结构Javascript中的类型对象
Correct structure for "static" type objects in Javascript
我正在努力掌握在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中实现这样的模式的正确方法是什么?
我希望这是有意义的?如果太啰嗦,我很抱歉,但我不想遗漏任何可能重要的东西。
很多谢谢,詹姆斯。
继承是解决这个问题的一种方法,例如:
function searchOperator() {
}
//searchOperator.prototype.toString = ...
functionOperator = function(operator) {
searchOperator.apply(this);
this.operator = operator;
}
functionOperator.prototype = Object.create(searchOperator.prototype);
functionOperator.prototype.buildCondition = function (fieldName, searchTerm) {
return this.operator + "(" + fieldName + ", '" + searchTerm + "')";
}
operators = {
STARTSWITH: new functionOperator('startswith')
}
console.log(operators.STARTSWITH.buildCondition('foo', 'bar'))
相关文章:
- JavaScript类型的、警报和应用
- 在JavaScript类型的函数中避免self-this
- Javascript 类型未定义和 void 之间的区别
- 在Resharper中禁用javascript类型强制警告
- 如何解析 JavaScript 类型 html
- Typeahead的Javascript类型返回未定义
- 在Ruby Slim文件中设置Javascript类型
- 寻找Javascript类型数组仿真库
- JavaScript 类型强制首选项
- JavaScript 类型数组 - 不同的视图 - 2.
- JavaScript 类型数组 - 不同的视图
- JavaScript 类型错误
- 如何处理未定义属性的未定义属性 javascript 类型错误
- Javascript类型转换悖论
- 一种更精致的Javascript类型
- JavaScript 类型注释
- JavaScript 类型参数的有效性
- JavaScript 类型的内存分配
- Javascript 类型错误:oauth 不是构造器
- 奇怪的JavaScript类型转换