我正在努力地尝试在JavaScript中创建“静态”对象类型(我怀疑我的措词是否正确……)。

在下面的代码中,我试图创建一个jQuery插件(不过我怀疑这是无关紧要的),该插件创建多个CrmQuery,每个instance都带有以CrmQuery形式传递的自己的上下文信息。我还想为所有CrmQuery使用创建一个“静态”对象(它可以是无状态的),并希望将其包含在CrmQuery.searchOperator[instance.Operator].buildCondition(instance.fieldName, searchTerm)命名空间中。

这就是我的结构,但是在调用buildCondition时,oDataOperator函数无法访问CrmQuery.searchOperator中的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'))

07-24 16:18