【问题标题】:Specifying property assignment in object instantiation using a class [duplicate]使用类在对象实例化中指定属性分配
【发布时间】:2020-04-15 21:37:40
【问题描述】:

假设我有一堂课

class Something {
  constructor(a, b) {
    this.a = a;
    this.b = b;
  }
}

我怎样才能实例化一个对象,以便我只给b赋值而不给a赋值?

例如类似于:

let someObject = new Something(b : 10);

预期输出:

log(someObject.a) // undefined
log(someObject.b) // 10 

出于代码可读性的原因,如果可以的话,我想避免使用let someObject = new Something(undefined, 10);

我对 js 有点陌生,我不确定这是否可能,但任何帮助或指导将不胜感激!

【问题讨论】:

  • 通过undefined 似乎正是您想要的。
  • 未测试,但这里有一个想法:将对象传递给构造函数(constructor(values))并将它们分配为:this.a = values.a; 等。然后您可以执行let someObject = new Something({b : 10});。我的意思是,使用 undefined 对我来说似乎是合理的,但如果这种对象方法最适合您,那就太好了。
  • JS中没有命名参数传递。如果你想模拟的话,你可以传递一个对象,带有字段ab
  • 将a作为第二个参数,并将其设置为默认值constructor(b, a = 0) {...}。然后你可以只用一个参数创建你的实例:const a = new Something(5);
  • @chriskirknielsen 这似乎是最接近我需要的解决方案。如果我必须首先考虑这一点,也许我应该考虑限制构造函数中的参数数量。

标签: javascript class ecmascript-6


【解决方案1】:

你可以这样做:

class Something{
  // private properties don't even work in Firefox and the syntax is just more typing than constructors
  constructor(b, a){
    this.a = a;
    this.b = b;
  }
}
const something = new Something(10);
console.log(something);

但我会这样做:

function Something(b, a){
  let see = 'Wow these private varibles are really easy to use in costructors! Classes are lame!';
  this.a = a; this.b = b;
}
const something = new Something(10);
console.log(something);

阅读您的评论后:

function Something(){
  this.objects = [].slice.call(arguments);
  this.getObjIndex = obj=>{
    return this.objects.indexOf(obj);
  }
  this.getObjByIndex = index=>{
    return this.objects[index];
  }
}
const objTest1 = {test:1}, objTest2 = {test:2}, objTest3 = {really:'cool', why:['a', 2, 'z']};
const something = new Something(objTest1, objTest3);
console.log(something.objects);
console.log(something.getObjIndex(objTest3));
console.log(something.getObjByIndex(0));

@VLAZ 有这么多 cmets(顺便说一句,我对此没有任何问题),我必须展示私有变量:

function PrivateTest(){
  let test = 'cool';
  this.getTest = ()=>{
    return test;
  }
  this.setTest = mixed=>{
    test = mixed;
    return this;
  }
}
const pt = new PrivateTest;
console.log(pt.getTest());
console.log(pt.setTest('Look, VLAZ, it works!').getTest());

【讨论】:

  • 为什么私有财产是相关的?此外,私有变量与私有属性的语义完全不同。后者会更像const Something = (function() { let private = "hidden but accessible in methods"; const constructor =function Something(){}; /* add methods */; return constructor; })();
  • @VLAZ,我表明constructors 实际上比classes 更易于使用,functions 实际上并没有引入新的层次结构。 Firefox 甚至不支持私有属性。它们是私有的,因此无论如何它们都不会被继承。您评论中的示例只是抛出一个自执行函数并返回构造函数。就好像你从未运行过我的代码 sn-p。底线:你对语义不正确......你评论中的例子是无用的。
  • 我再问一次,为什么私有财产是相关的?你最初的回答对他们很重要,你是第一个提到私人财产的人。我指出私有 variable 和私有 property 具有不同的语义 - 属性将在方法中可见,而私有变量则不会。如果您在构造函数内部分配方法,那么您实际上是在浪费原型并将大量函数保留在内存中,而不是为每个函数保留一个副本。
  • 有时我不想在 for in 循环中显示 30 个私有属性。如果您将变量设为构造函数私有,而不是方法私有,则该变量可用于所有方法。
  • 这与这个问题有什么关系?
猜你喜欢
  • 2021-08-18
  • 2022-06-11
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多