“的正确结构”;“静态”;在Javascript中键入对象

“的正确结构”;“静态”;在Javascript中键入对象,javascript,design-patterns,properties,scope,static,Javascript,Design Patterns,Properties,Scope,Static,我正在努力掌握如何在JavaScript中创建“静态”对象类型(我甚至怀疑我的措辞是否正确…) 在下面的代码中,我试图创建一个jQuery插件(不过我怀疑这是不相关的),它创建多个CrmQuery,每个都有自己的上下文信息作为实例传递。我还想创建一个“静态”对象,供所有CrmQuery使用(它可以是无状态的),并希望将其包含在CrmQuery名称空间中 这是我拥有的结构,但是当调用CrmQuery.searchOperator[instance.Operator].buildCondition(

我正在努力掌握如何在JavaScript中创建“静态”对象类型(我甚至怀疑我的措辞是否正确…)

在下面的代码中,我试图创建一个jQuery插件(不过我怀疑这是不相关的),它创建多个
CrmQuery
,每个都有自己的上下文信息作为
实例传递。我还想创建一个“静态”对象,供所有
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中实现这种模式的正确方法是什么

我希望这有意义?如果太冗长,我会道歉,但我不想遗漏任何可能重要的内容

非常感谢,,
James

继承是解决此问题的一种方法,例如:

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'))

继承是解决此问题的一种方法,例如:

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'))

谢谢你,乔治。我是在
CrmQuery
函数中声明所有这些,还是它们位于函数之外?此外,我还不太了解逻辑-functionOperator是否继承自searchOperator,但添加了
buildCondition
函数?此外,操作符应该向
buildCondition
指示使用哪个函数来构建自身。在您的示例中,这是如何实现的,因为您将
buildCondition
作为实际代码,而不是调用特定于运算符的函数?
searchOperator
是一个抽象类,它不知道如何构建条件。我将像
STARTSWITH
这样的运算符编码为
functionOperator
的实例,但它们也可以是具有特定功能的子类。我是在
CrmQuery
函数中声明所有这些,还是它们位于函数之外?此外,我还不太了解逻辑-functionOperator是否继承自searchOperator,但添加了
buildCondition
函数?此外,操作符应该向
buildCondition
指示使用哪个函数来构建自身。在您的示例中,这是如何实现的,因为您将
buildCondition
作为实际代码,而不是调用特定于运算符的函数?
searchOperator
是一个抽象类,它不知道如何构建条件。我将像
STARTSWITH
这样的运算符编码为
functionOperator
的实例,但它们也可以是具有特定功能的子类