【问题标题】:javascript class instance object literaljavascript 类实例对象字面量
【发布时间】:2018-02-08 06:52:00
【问题描述】:

是否有一种简写的方法可以在 javascript 中向类的实例添加属性?

编辑:重复的答案是关于向对象而不是类添加属性。我试图让用户轻松添加大约 10-20 个属性。我还试图确保他们不能添加自己的属性,而只能向预定义的属性添加值。我不知道该怎么做。

我有一个 javascript“类”:

function Car(){
this.make="";
this.model="";
//...
}

要创建一个实例并添加我将使用的属性:

var mycar = new Car();
    mycar.make="honda";
    mycar.model="civic";
    //...

是否有一种快捷方式来创建实例并添加属性,这样我就不必输入“mycar”了。每次?

【问题讨论】:

标签: javascript class object-literal shorthand


【解决方案1】:

如果你的构造函数没有做任何重要的事情,你可以使用Object.create():

function Car() {
  //...
}

console.log(
  Object.create(
    Car.prototype,
    Object.getOwnPropertyDescriptors(
      { make: 'honda', model: 'civic' }
    )
  )
);

我不会完全称它为“速记”,但它单个语句,如果你的构造函数的主体是多余的,它会省略调用Car()

我个人建议在 constructor 的正文中使用 Object.assign()

function Car(props) {
  /* to formally mimic behavior of default parameters specification */
  // props = arguments.length < 1 || props === undefined ? {} : props;
  /* commonly used "good-enough" ES5 equivalent */
  props = props || {};
  Object.assign(this, props);
}

console.log(
  new Car({ make: 'honda', model: 'civic' })
);

或 ES6:

class Car {
  constructor (props = {}) {
    Object.assign(this, props);
  }
}

console.log(
  new Car({ make: 'honda', model: 'civic' })
);

【讨论】:

  • 当你可以像使用构造函数模式一样将它们作为参数传递时,为什么要复杂化?
  • @Li357 我试图澄清这不是我的主要建议,我只是指出可以在不显式调用构造函数的情况下创建Car 的实例。如果您愿意,我可以尝试更清楚地说明我的最后两种方法是我的实际建议。
  • 我只是想知道,因为 OP 已经证明他们的构造函数设置了两个实例变量,然后立即重置它们,你可以将它们作为单独的参数传递,而不是带键的对象。
  • 如果你只有两个键,那很好,但是如果你的类有几个属性呢?当然,您不想一次分配每个。
  • 我认为第三个示例对用户来说很容易输入 10-20 个属性而不会混淆。看起来用户可以分配他们想要的任何属性。如果他们犯了拼写错误,它将添加该属性。如何预设它们以便只添加我指定的属性?
【解决方案2】:

你应该使用构造函数的参数:

function Car(make, model) {
  this.make = make;
  this.model = model;
}
var mycar = new Car("honda", "civic");

【讨论】:

    【解决方案3】:

    你可以使用Object.assign函数。

    function Car() {
      this.make = "";
      this.model = "";
    }
    
    var mycar = new Car();
    Object.assign(mycar, { make: "honda", model: "civic" });
    
    console.log(mycar);

    【讨论】:

    • 这个问题已经被问过很多次了。当我投票关闭重复项时,我注意到你的名字出现了很多。你在回答之前检查重复吗?
    • A)这是更多的字节码,B)这没有任何意义!如果可以正确使用构造函数模式并将它们作为参数传递,为什么要将它们设置为空字符串然后更改它们??
    • @Li357 我的回答提供了一种速记方式
    • @Ele 这如何比将值传递给构造函数更短?与使用 Object.assign 相比,这将是更好的做法,更具可读性和更短
    • @Li357 我同意,但是,我正在使用 OP 的方法。没有人知道他/她的代码上下文的信息。没有人知道他/她为什么要为初始化编写带有空值的构造函数。此外,通过这种方法,OP 将知道另一种将属性分配给对象的方法。
    猜你喜欢
    • 2016-05-15
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2014-02-26
    • 1970-01-01
    • 2010-11-09
    • 2013-02-22
    相关资源
    最近更新 更多