【问题标题】:In ES6 is destructuring Class Instance properties permitted?在 ES6 中是否允许解构类实例属性?
【发布时间】:2016-02-22 11:13:59
【问题描述】:

假设我有以下代码:

class Foo {
    constructor() {
        this.a = 1;
        this.b = 'something';
    }

    someMethod() {
        // Is this legal?
        let { a, b } = this;
    }
}

someMethod 中的解构赋值合法吗?

我的直觉是它很好,但我在任何文档中都没有看到这种用法。它目前在 Babel 中工作,但大概是因为 Babel 正在将类转换为函数。我的理解是(几乎)JS 原型中的所有内容都继承自 Object,所以我可能认为 Classes 和 Class 实例也是如此。

我看到的唯一参考 is here 并指定 JS 引擎调用内部方法 ToObject 只会在遇到 nullundefined 时抛出 TypeError。但是ToObject docs 没有明确提到类实例。

【问题讨论】:

  • 与您的问题无关,但您有什么特别的原因使用 let 而不是 var 吗?
  • 是的,但()Foo 之后不是
  • 很多程序员每次都会使用let,因为他们听说这是个好主意;不管是否有任何方块在游戏中……你对let有问题吗?
  • @VladNicula 对于一个最小(几乎)工作示例来说似乎是一个奇怪的问题,该示例显然旨在显示问题的主要内容
  • @all,如果有某种性能优势,我只是好奇。有趣的是,你们中的大多数人是如何从我的问题中得到负面情绪的 :)

标签: javascript ecmascript-6 destructuring


【解决方案1】:

明确允许解构对象并且是一项功能。
this 仅指一个对象。它没有什么特别之处。
只要this 引用一个对象,这绝对没问题。 *

* this 可能引用一个对象,具体取决于您如何调用someMethod,例如Foo.someMethod.apply(null)。但无论如何,你确实有更大的问题。

【讨论】:

  • 当然谢谢,只是想明确澄清一下,因为其他示例只处理普通对象而不是类实例
  • @baseten 你的好奇心是可以理解的。 :) 从广义上讲,class 语法是现有 ES5 使用函数构造函数的方法的一个糖,只有一些语义差异,所以你最终得到了本质上相同的东西:一个具有你可以访问和解构的属性的对象。 (主要区别很小,必须使用 new 关键字调用类,不能提升类声明,不能枚举原型属性,子类化的工作方式略有不同等。)
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 2016-06-19
  • 2012-02-25
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
相关资源
最近更新 更多