当前位置: 首页 > 知识库问答 >
问题:

在函数构造函数中设置ES6模板文字的上下文?

杨景山
2023-03-14

我的应用程序获取资源字符串占位符令牌列表,它应该使用给定值更改令牌。

这种资源的一个例子是:“http://example.com/?name=${name}

(我在数组中得到了许多这样的,但这无关紧要)。

现在我有了这个^字符串,我有了值。所以我需要生成消化的字符串。

当然我可以使用 eval

var template = "http://example.com/?name=${name}&age=${age}";
var name = "John";
var age = "30";
var url = eval(`\`${template}\``);
console.log(url); //http://example.com/?name=John&age=30

这个管用。但是我不想使用< code>eval

所以我切换到新函数()()的其他方法:

var url = new Function ('tmpl','obj','return `${tmpl}`')

这产生了以下功能:

ƒ anonymous(tmpl,obj ) {
return `${tmpl}`
}

所以现在我能做的是:

new Function ('tmpl','obj','return `${tmpl}`')(template ,{name, age})

但是现在我需要在内部函数中分解 obj,以便模板文字知道值

顺便说一句——我已经试过了——没有成功:

(new Function ('tmpl','obj','return `${tmpl}`').bind({name,age})) (template)

问题

如何在内部函数中展平obj以便${}将具有已知的本地值?

注意,我不喜欢使用正则表达式解决方案,因为在模板文本中有换行符。此外,这些资源有意采用es6模板字符串的格式

在线演示

共有2个答案

巢睿
2023-03-14

eval解决方案的正确新函数替换是

var template = "http://example.com/?name=${name}&age=${age}";
var makeUrl = new Function("{name, age}", "return `" + template + "`;");
var url = makeUrl({name: "John", age: 30});
console.log(url); //http://example.com/?name=John&age=30

您的函数刚刚返回了传递给它的< code>tmpl字符串。

樊杰
2023-03-14

我已经成功地用我想要的模板字符串解决了这个问题。

setString(resource: string, obj: {}) {
    const names = Object.keys(obj);
    const vals = Object.keys(obj).map(key => obj[key]);
    return new Function(...names, `return \`${resource}\`;`)(...vals);
  }

var str = "We've sent your code to ${phone}.";
console.log(this.setString(str, { phone: 123 }))

输出:

“我们已经把你的代码发送到了123。

演示

 类似资料:
  • 我有一个类,它的操作类似于智能指针。以下是重要的比特: 现在,我希望能够从构造,而不是相反。复制赋值运算符也是这样:应该合法,但不应该合法。 现在,我想添加一个模板,专门化或其他东西,但我肯定有一个更好的方法来做这件事。请注意,非常量版本必须将常量版本添加为友元,才能访问constructor/assignmnent运算符中的私有成员。

  • 在像 JavaScript 这种没有类的概念的语言中,如果想创建特定的实例对象,可以通过在函数之前加上 new 关键字来实现。在调用构造函数时可以传入参数以初始化实例对象的属性值。用这种方式创建的实例对象的属性和方法是独立的,不与其他实例对象共享。 在 JavaScript 中,构造函数一般长这样: function FamilyMember( name, age ) { this.name =

  • 问题内容: 到目前为止,我已经看到了两种在Java中设置变量值的方法。有时使用带有参数的构造函数,而其他setter方法则用于设置每个变量的值。 我知道,一旦使用“新”关键字实例化了一个类,构造函数就会在类内部初始化一个实例变量。 但是,什么时候使用构造函数,何时使用setter? 问题答案: 当您要创建对象的新实例时,应使用构造函数方法,该实例的值已填充(准备使用的对象中已填充值)。这样,您无需

  • 问题内容: 我正在尝试将属性的Maps保留为单个JSON编码的列 我遇到的问题是,显然 无法在默认地图构造函数中设置瞬时属性 。给定任何瞬态场: 似乎地图构造函数(Grails以各种方式覆盖)只是丢弃了瞬态字段: 虽然直接分配(通过setter方法)可以按预期工作: 有没有办法让地图构造函数接受瞬态字段? 或者更确切地说:有没有比链接的问题中显示的方法更好的方法来将a保留为单个JSON编码的DB字

  • 问题内容: 我正在将React组件更新到ES6的过程中,遇到了该问题中描述的问题- 无法在事件处理程序内部访问React实例(this) -即未绑定到组件实例。 这是有道理的,当然可以,但是我对答案的另一部分感到困惑: 请注意,绑定功能会创建一个新功能。您可以将其直接绑定到render中,这意味着每次渲染该组件时都会创建一个新函数,或者将其绑定到构造函数中,后者只会触发一次。 与 我假设在构造函数

  • 介绍 构造函数大家都很熟悉了,不过如果你是新手,还是有必要来了解一下什么叫构造函数的。构造函数用于创建特定类型的对象——不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值。你可以自定义自己的构造函数,然后在里面声明自定义类型对象的属性或方法。 基本用法 在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函