【问题标题】:JavaScript Chainable Method DelimmaJavaScript 可链式方法困境
【发布时间】:2016-04-08 13:53:48
【问题描述】:

我有 2 个方法想用作可链接的方法。可以链接其他方法来进一步修改文本。

left 从左侧返回 X 个字符。 right 从右边返回 X 个字符。

目前我可以这样做:

var txt = "hello";
S$(txt).left(4).right(2).val //returns "ll"

我想做的就是这个。 基本上我想在最后一个链接方法之后返回结果,而不必调用属性。这可能吗?

var txt = "hello";
S$(txt).left(4).right(2) //returns "ll"

下面是主要代码:

(function (global) {
    
    var jInit = function(text){
        this.text = text;
        this.val = text;
    }
    
    var jIn = function(text){
        return new jInit(text);
    }
    
    var jStringy = jStringy || jIn;
    
    
    jInit.prototype.left = function (num_char) {
        if (num_char == undefined) {
            throw "Number of characters is required!";
        }
        this.val = this.val.substring(0, num_char);
        return this;
    }
    
    jInit.prototype.right = function (numchar) {
        this.val = this.val.substring(this.val.length - numchar, this.val.length);
        return this;
    }

    global.jStringy = global.S$ = jStringy;
    
    return this;

}(window));

【问题讨论】:

  • 我假设 left 和 right 将始终对字符串进行操作?您也许可以使用这些属性扩展 javascript 字符串对象并获取值,而无需调用 val。
  • 您希望您的可链接函数返回一个 String 对象,但您不想明确告诉链何时结束,对吧?那么唯一的方法就是在String.prototype 中创建leftright 函数。
  • 这就是我所担心的,但是因为这是一个做原型的图书馆,所以不会是专业的。
  • 例如,lodash 是一个非常专业的库,它们具有可链接的功能。它使用.value() 来结束链。所以你也可以这样做,不会太冗长。

标签: javascript oop object methods method-chaining


【解决方案1】:

您可以覆盖 valueOftoStringObject 方法来归档它。

例子:

var myObject = {
    value: 5,
    valueOf: function(){
        return this.value;
    },
    toString: function() {
        return 'value of this object is' + this.value;
    }
};

由于 Javascript 是 duck typing language,没有什么可以阻止您针对 原始值/对象 执行 数学运算字符串连接方法在表达式评估过程中被调用,无论它们来自哪里。

例子:

console.log(myObject + 10); 将打印 15

alert(myObject); 将打印“此对象的值为 5”

【讨论】:

  • 谢谢!这是迄今为止最好的。为什么它不起作用? console.log(S$("hello").left(4).right(2)) console.log(myObject)
  • @ChicagoExcelUser - console.log() 不会自行强制转换 .toString() - 它只会打印出对象的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多