【问题标题】:Object.create() ES6对象.create() ES6
【发布时间】:2018-09-23 16:36:09
【问题描述】:

你能帮我理解 ES6 和 Object 吗?

class Contact{
       constructor(name,tel,mail)
       this.name=name;
       this.tel=tel;
       this.mail=mail; 

    method1(){
    //code
   }
}

如果我想创建一个联系人,我可以使用

const me = new Contact('David','070809112','10 street of Paris')

但是我不能在 ES6 之前使用 Object.create() 我可以在 ES6 中使用 Object.create() 你能帮我吗?

在 ES6 之前

var Contact ={
   init:function('name','tel','mail')
   this.name=name;
   this.tel=tel;
   this.mail=mail; 

method1 : function(){
  //code
 }
}
 var me = Object.create(Contact);
 me.init('David','070809112','10 street of Paris');

在这种情况下如何使用 Object.create() ?用于创建新联系人。谢谢

【问题讨论】:

  • 你想在Contact被定义为一个类的ES6中做Object.create(Contact)吗?
  • 您所做的比较被破坏了:您的最后一个代码示例没有构造函数,但有一个单独调用的 init 方法:您也可以使用 ES6 classObject.create 进行此操作。问题是您在 ES6 示例中引入了 constructor,由于某种原因您没有选择在 ES5 代码中使用它。所以这种比较真的行不通。

标签: javascript object ecmascript-6


【解决方案1】:

你可以继续做你正在做的事情,而不是使用class

如果您使用的是class,通常不会使用Object.createObject.create 的用例很大程度上与 class 无关(它通常用于直接原型继承,而不是使用构造函数)。

如果你想使用class,但由于某种原因不想使用new,你可以使用Reflect.construct(而不是Object.create):

class Contact {
    constructor(name, tel, mail) {
        this.name=name;
        this.tel=tel;
        this.mail=mail; 
    }
    method1(){
     //code
    }
}

const c = Reflect.construct(Contact, ["name", "tel", "mail"]);
console.log(c.name);

可以将Object.create 与您的class Contact 一起使用,如下所示:

// NOT A GOOD IDEA, see below
const c = Object.create(Contact.prototype);

这会创建一个使用Contact.prototype 作为原型的对象。但它不调用构造函数,之后你不能调用构造函数(Contact.call(c, "name", "tel", "email") 会失败)。而且您不能确定不调用构造函数不会导致问题,因为class 代码假定调用了构造函数(以及超级构造函数,如果有的话)。

【讨论】:

  • 我理解类在这种情况下不能使用 Object.create() 谢谢
  • @Parad0xJ - 好吧,你可以const c = Object.create(Contact.prototype); 将使用来自Contact 的原型创建一个对象。但它不运行构造函数,你不能单独运行它(执行Contact.call(c, "name", "tel", "mail") 会失败)。
  • T.J.Crowder 感谢您的所有解释我很理解我的错误
  • 我有一个继承自 HTMLElement 的类 Foo。为了避免illegal constructornew Foo() 出现问题(Reflect.construct(Foo,[]) 相同),我使用 Object.create(Foo.prototype)。 => 对于 ES6 类,Object.create 仍然有一个(有限的)用例。另见stackoverflow.com/questions/57478484/…
【解决方案2】:

T.J Crowder 的回答是我见过的最好的东西。是的,Reflect.construct() 按预期工作,这节省了我一天的搜索时间,因为我遇到了一个问题,我想在 laravel 刀片后面调用一个带有实例的函数以及其他变量,但是在两者之间添加一个空格使愚蠢的事情打破了,所以我不能使用新的关键字。 javascript 的灵活性挽救了这一天。学到了一个全新的东西,感谢您忘记了为什么不想使用 new 关键字并专注于回答问题。我希望我可以评论他的回答,但代表低。

我有这个 onclick={{$var1.".method( new MyClass(this.id,'".$var2."','".$var3."') )"}}

我有时讨厌模板引擎的另一个原因,它们可能会限制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多