JavaScript链式方法的困境

5

我有两种方法想要作为链式方法使用。其他方法可以链接以进一步修改文本。

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


我假设左右操作始终在字符串上进行?您可能能够通过扩展JavaScript字符串对象来获取这些属性的值,而无需调用val。 - lintmouse
你想让可链式调用的函数返回一个 String 对象,但是你不想明确地告诉它何时链结束,对吧?那么唯一的方法就是在 String.prototype 中创建 leftright 函数。 - mostruash
这正是我担心的,但既然这是一个库,做原型并不专业。 - Chicago Excel User
例如,lodash 是一个非常专业的库,它具有可链接的函数。它使用 .value() 来结束链式调用。所以你也可以这样做,它并不会太啰嗦。 - mostruash
1个回答

6
你可以重写Object类的valueOftoString方法来实现它。
例如:
var myObject = {
    value: 5,
    valueOf: function(){
        return this.value;
    },
    toString: function() {
        return 'value of this object is' + this.value;
    }
};

由于 JavaScript 是一种 鸭子类型语言,所以无论方法是从哪里来的,在表达式求值过程中都会执行数学运算字符串拼接。这意味着您可以对原始值/对象执行这些操作。

例子:

console.log(myObject + 10); 将输出15

alert(myObject); 将输出'value of this object is 5'


谢谢!这是目前为止最好的。 为什么它不起作用? console.log(S$("hello").left(4).right(2)) console.log(myObject) - Chicago Excel User
@ChicagoExcelUser - console.log() 不会自动强制执行 .toString() 转换,它只会愉快地打印出对象的内容。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接