Object.create()ES6

时间:2018-09-23 16:36:09

标签: javascript object ecmascript-6

您能帮助我理解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()?用于创建新的联系人。谢谢

2 个答案:

答案 0 :(得分:3)

您可以继续做自己正在做的事情,而不使用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.createclass Contact一起使用// NOT A GOOD IDEA, see below const c = Object.create(Contact.prototype); ,如下所示:

Contact.prototype

Contact.call(c, "name", "tel", "email")作为原型创建对象。但是它不会调用构造函数,以后也无法调用构造函数(class会失败)。而且您不能确定不调用构造函数不会导致问题,因为month代码假定构造函数(以及超级构造函数,如果有)被调用。

答案 1 :(得分:0)

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

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

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