Javascript 将新属性添加到`this`外部`constructor()`方法被认为是错误的做法吗?

Javascript 将新属性添加到`this`外部`constructor()`方法被认为是错误的做法吗?,javascript,object-oriented-analysis,Javascript,Object Oriented Analysis,我有以下课程: class Sample { constructor() { ... this.extra_method(); } extra_method() { this.property1 = "property1"; .... } } 将属性添加逻辑(this.property1=“property1”)移动到构造函数()方法中是否更合适 我在寻找具体的原因,而不是观点。谢谢。JavaScript引擎通过(除

我有以下课程:

class Sample {
   constructor() {
       ...
       this.extra_method();
   }

   extra_method() {
      this.property1 = "property1";
      ....
   }
}
将属性添加逻辑(
this.property1=“property1”
)移动到
构造函数()方法中是否更合适


我在寻找具体的原因,而不是观点。谢谢。

JavaScript引擎通过(除其他外)使属性查找不是B树式的查找,而是更接近分派表的方式,积极优化对象,包括对象上的属性查找。(V8,Chrome、Node.js和其他浏览器中的JavaScript引擎为程序中标识为热点的代码编译机器代码类;有关详细信息,请参阅。)这意味着每次对象的形状(其属性)发生变化时,引擎都必须调整优化的对象以处理(或取消优化对象)

现代引擎很大程度上希望,一旦构造函数返回,对象的形状就会设置好,并准备好进行优化。这意味着以后向其添加属性可能会对对象进行去优化(将其转化为一个B树映射),或者导致引擎必须重新进行优化


这有关系吗?这取决于类创建的对象是否是性能瓶颈。如果是这样,避免形状变化可能会有所帮助。如果不是,那没关系。因此,这是否是“最佳实践”可能取决于人们的看法。

JavaScript引擎通过(除其他外)使属性查找不是B树式的查找,而是更接近调度表的方式,积极优化对象,包括对象上的属性查找。(V8,Chrome、Node.js和其他浏览器中的JavaScript引擎为程序中标识为热点的代码编译机器代码类;有关详细信息,请参阅。)这意味着每次对象的形状(其属性)发生变化时,引擎都必须调整优化的对象以处理(或取消优化对象)

现代引擎很大程度上希望,一旦构造函数返回,对象的形状就会设置好,并准备好进行优化。这意味着以后向其添加属性可能会对对象进行去优化(将其转化为一个B树映射),或者导致引擎必须重新进行优化


这有关系吗?这取决于类创建的对象是否是性能瓶颈。如果是这样,避免形状变化可能会有所帮助。如果不是,那没关系。因此,它是否是“最佳实践”可能属于意见的范畴。

我建议您改写以强调您寻找的是特定的原因,而不是意见。如果最初不需要该属性,并且构造函数无法知道要在其中放入什么,那么此时它如何初始化它?做对应用程序最有意义的事情,这个问题没有一个一刀切的答案。@Barmar-通常使用
undefined
。并且同意,没有一个一刀切的答案。特别是,一个对象可能会使用动态属性,因此在构建时不可能知道所有属性(尽管您可以将其作为嵌套对象,而不是将属性放在主对象本身中)。@Barmar-可能是一个
映射
偶数。:-)我建议你重写,以强调你是在寻找特定的原因,而不是观点。如果最初不需要属性,并且构造函数无法知道要在其中放入什么,那么它当时如何初始化它?做对应用程序最有意义的事情,这个问题没有一个一刀切的答案。@Barmar-通常使用
undefined
。并且同意,没有一个一刀切的答案。特别是,一个对象可能会使用动态属性,因此在构建时不可能知道所有属性(尽管您可以将其作为嵌套对象,而不是将属性放在主对象本身中)。@Barmar-可能是一个
映射
偶数。:-)因此,在构造函数中设置
this.property1=undefined
,使设置
this.property1=“property1”
稍后变得很好?@3limin4t0r-正确,因为这只会更改属性的值,而不是对象的形状。但同样,这只在性能关键型代码中起作用。因此,在构造函数中设置
this.property1=undefined
,会使设置
this.property1=“property1”
在以后变得很好?@3limin4t0r-对,因为这只会更改属性的值,而不是对象的形状。但同样,这只在性能关键的代码中起作用。