【问题标题】:can es6 class have public properties as well as functions?es6 类可以具有公共属性和功能吗?
【发布时间】:2015-08-25 16:36:04
【问题描述】:

我看到的所有类的例子都是

class myClass{
    constructor(){}
    someFunction(){}

我要补充的是

    someObject {myvalue:value}
}

这似乎无法编译。一个老式的对象是

{
    somefunction: function(){}
    someProperty:  {myvalue:value}
} 

这在 es6 类中是不可能的吗?

【问题讨论】:

  • 为什么要将值存储在原型上?

标签: javascript class properties public ecmascript-6


【解决方案1】:

你需要把它放在你的构造函数中:

class myClass{
    constructor(){
        this.someObject = { myvalue:value };
    }
}
var obj = new myClass();
console.log(obj.someObject.myvalue); // value

如果需要,您可以像在 ES5 中一样将对象添加到原型链中:

class myClass{
    constructor(){

    }
}
myClass.prototype.someObject = { myvalue:value };
var obj = new myClass();
console.log(obj.someObject.myvalue); // value

请注意,类上没有真正的私有属性。您附加到类的任何变量都是公共的。

Class Properties in ES7 有一个阶段 0 提案。如果使用 Babel,可以使用 Experimental 模式启用,允许以下操作:

class MyClass {
  myProp = {value: "one"};
  constructor() {
    console.log(this.myProp);
  }
}

【讨论】:

  • 嗨,谢谢,但我真的希望它在原型和类声明中都有。这可能吗?
  • 目前,您可以像在 ES5 中一样添加到原型中:myClass.prototype.someObject = { ... };。如果你使用 Babel,它允许 ES7 Class Properties 在实验模式下
  • 我不得不说这是类规范中几乎荒谬的遗漏。我的意思是什么样的白痴设计了一个只有函数的类?如果你只想要函数,你甚至不需要一个该死的类。非常令人沮丧的情况。无论如何,感谢您向我指出 es7 babel 解决方案。
  • 好的,在阅读了关于类属性的 babel 文档之后,它似乎确实有点问题。源于 js 使用的原型继承。这也许是 js 中从来没有也不应该有类结构的原因之一,因为它使人们相信这个类的行为与几乎任何其他语言中的类相似,这是不正确的。
【解决方案2】:

有一种简单的方法可以模拟属性:getter。

var obj = {myvalue:value};

class Foo {
    get someProperty() {
       return obj;
    }
}

使用它是否有意义完全取决于用例。

【讨论】:

  • 好的,谢谢。我的目标是一些优雅的东西作为我的域的模式。优雅我的意思是简单,没有很多必要的程序知识。我认为类语法糖不会起作用。但我可能会找到办法。所以我的对象将是一个函数的集合。我不想让它嵌套得比必要的更深。
  • 嘿,我忘了 ES5 的吸气剂——这比使用 ES6 中不明显的原型要干净得多。
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2017-04-29
相关资源
最近更新 更多