1
假设我有一个函数叫做log
,它只是打印给定的字符串。JavaScript:以任何顺序执行链式方法
我可以重构我的代码,这两个函数都可以工作吗?
log("needsChange").doSomethingWithTheStringBeforePrintingIt();
log("perfectStringToPrint");
假设我有一个函数叫做log
,它只是打印给定的字符串。JavaScript:以任何顺序执行链式方法
我可以重构我的代码,这两个函数都可以工作吗?
log("needsChange").doSomethingWithTheStringBeforePrintingIt();
log("perfectStringToPrint");
我做了一个库来解决这个问题 https://github.com/omidh28/clarifyjs
你可以使用嵌套类逻辑类似:
var log = (function() {
//Class
var _log = (function() {
function _log(message) {
this.message = message;
}
_log.prototype.doSomethingWithTheStringBeforePrintingIt = function() {
this.message = this.message.split("").reverse().join("");
return this;
};
_log.prototype.capitalizeFirstWord = function() {
this.message = this.message[0].toUpperCase() + this.message.substr(1);
return this;
};
_log.prototype.print = function() {
return this.message;
};
return _log;
}());
//Instancer function
return function log(message) {
//Return instance of class
return new _log(message);
};
})();
//Test
console.log(log("needsChange")
.doSomethingWithTheStringBeforePrintingIt()
.capitalizeFirstWord()
.print(), log("perfectStringToPrint")
.print());
如果你是舒服的诺言,那么你可以做这样的事情:
var logger = (function() {
//Class
var _log = (function() {
function _log(message) {
var _this = this;
this.message = message;
this.promise = null;
this.promises = [];
this.promise = Promise.all(this.promises).then(function(values) {
console.log(_this.message); // [3, 1337, "foo"]
});
}
_log.prototype.reverse = function() {
var self = this;
this.promises.push(new Promise(function(resolve, reject) {
setTimeout(resolve, 0, (function() {
self.message = self.message.split("").reverse().join("");
})());
}));
return this;
};
_log.prototype.capitalizeFirst = function() {
var self = this;
this.promises.push(new Promise(function(resolve, reject) {
setTimeout(resolve, 0, (function() {
self.message = self.message[0].toUpperCase() + self.message.substr(1);
})());
}));
return this;
};
return _log;
}());
//Instancer function
return function log(message) {
//Return instance of class
return new _log(message);
};
})();
//Test
logger("needsChange").reverse().capitalizeFirst().reverse(); //Capitalizes last letter
logger("perfectStringToPrint");
这消除了拨打.print
电话的需要。
这句法是可能的,如果日志返回函数DoSomething的,或与该方法的对象。 – Shilly
@Shilly是的,但问题是,字符串已经打印出来,所以它要迟到做任何事情。 – omidh
您必须在打印字符串之前进行所有编辑。埃米尔的回答告诉你如何做到这一点。如果你有办法检测一个字符串是否是'perfectStringToPrint',如果'needsChange'被检测为不完美,通过将实际的console.log调用移动到'doSomethingWithTheStringBeforePrintingIt'中,仍然有可能得到这个确切的语法。 – Shilly