【问题标题】:ES7 Classes: Declaring Properties Outside of ConstructorES7 类:在构造函数之外声明属性
【发布时间】:2016-04-25 23:54:24
【问题描述】:

在构造函数内部和外部声明变量有什么区别吗?

对于函数,'this' 的绑定方式不同,但对于变量,我不知道是否有区别。

class Widget {
    constructor(constructorName) {
    this.constructorName = constructorName;
  }
  nonConstructorName = "nonConstructorName1";
}



var myWidget = new Widget("myConstructorName1");

console.log(myWidget.constructorName); // "myConstructorName1"
console.log(myWidget.nonConstructorName); // "nonConstructorName1"

myWidget.constructorName = "myConstructorName2";
myWidget.nonConstructorName = "nonConstructorName2";

console.log(myWidget.constructorName); // "myConstructorName2"
console.log(myWidget.nonConstructorName); // "nonConstructorName2"

console.log(myWidget.prototype.constructorName); // "undefined"
console.log(myWidget.prototype.nonConstructorName); // "undefined"

console.log(myWidget.__proto__.constructorName); // "undefined"
console.log(myWidget.__proto__.nonConstructorName); // "undefined"

var myNewWidget = new Widget("myConstructorName3");

console.log(myNewWidget.nonConstructorName); // "nonConstructorName1"

【问题讨论】:

  • 这是在引用我的场景吗?“没有(有意)直接的声明方式来定义原型数据属性(方法除外)类属性或实例属性。” wiki.ecmascript.org/…
  • 我不确定您是否可以按照您要定义的方式在类定义中包含属性。基于此:babeljs.io/docs/learn-es2015/#classesconstructor 方法之外没有属性定义,如果您在此处尝试 ES6 代码:babeljs.io/repl 您将看到 ES6 转译器在@987654327 之外为属性定义产生错误@方法。
  • 如果你想在类构造之外拥有一些私有属性,也许可以阅读这个问题:goo.gl/qzau3o,它有几个很好的答案。
  • @merianos-nikos:我正在使用 Babel 6 进行编译,有趣的是,它不会引发错误。
  • @merianos-nikos:Babel REPL 还没有升级到 Babel 6。

标签: javascript ecmascript-2016


【解决方案1】:

@merianos-nikos 在 cmets 中回答...

“这里的方法是使用构造函数的作用域,它是私有的,来存储私有数据。对于有权访问这些私有数据的方法,它们也必须在构造函数中创建,这意味着你正在重新创建每个实例都使用它们。这是性能和内存损失,但有些人认为这种损失是可以接受的。"

Private properties in JavaScript ES6 classes

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 2023-04-02
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2011-03-12
    • 2022-10-15
    • 2020-04-07
    相关资源
    最近更新 更多