推迟执行ES6模板文字

我正在玩新的ES6模板文字function,我头上的第一件事是一个Javascript的String.format ,所以我去实现一个原型:

 String.prototype.format = function() { var self = this; arguments.forEach(function(val,idx) { self["p"+idx] = val; }); return this.toString(); }; console.log(`Hello, ${p0}. This is a ${p1}`.format("world", "test")); 

ES6Fiddle

但是,模板文字传递给我的原型方法之前进行了评估。 有什么办法可以编写上面的代码来推迟结果,直到dynamic创build元素之后?

我可以看到三个方面:

  • 使用模板string就像它们被devise为使用,没有任何formatfunction:

     console.log(`Hello, ${"world"}. This is a ${"test"}`); // might make more sense with variables: var p0 = "world", p1 = "test"; console.log(`Hello, ${p0}. This is a ${p1}`); // or even function parameters for actual deferral of the evaluation: const welcome = (p0, p1) => `Hello, ${p0}. This is a ${p1}`; console.log(welcome("world", "test")); 
  • 不要使用模板string,而要使用纯string文字:

     String.prototype.format = function() { var args = arguments; return this.replace(/\$\{p(\d)\}/g, function(match, id) { return args[id]; }); }; console.log("Hello, ${p0}. This is a ${p1}".format("world", "test")); 
  • 使用标记的模板文字。 请注意,replace仍然会被处理程序截取而不被拦截,因此,如果没有名为so的variables,则不能使用p0标识符。 如果接受不同的replace主体语法提议 (更新:不是),则此行为可能会更改。

     function formatter(literals, ...substitutions) { return { format: function() { var out = []; for(var i=0, k=0; i < literals.length; i++) { out[k++] = literals[i]; out[k++] = arguments[substitutions[i]]; } out[k] = literals[i]; return out.join(""); } }; } console.log(formatter`Hello, ${0}. This is a ${1}`.format("world", "test")); // Notice the number literals: ^ ^ 
Interesting Posts