为什么 connectCallback() 没有绑定到与具有自定义元素 v1 的构造函数相同的 this?

Why is connectCallback() not bound to the same this as the constructor with custom elements v1?

对自定义元素有更好了解的人能否解释为什么 connectedCallback 在 Chrome 中绑定到此,但在 Safari、IE 和 FF 中却没有?

"use strict";


class XChat extends HTMLElement {

  constructor() {
    super();
    this._chats = null;
    console.log(this._chats); // null
  }

  connectedCallback() {

    console.log(this._chats); // undefined in safari, IE, FF, null in chrome
  }

}
customElements.define('x-chat', XChat);

并且在 webpack 入口文件中:

import 'document-register-element';
import './components/x-chat/index.html';

您需要一个 polyfill 才能在 Safari、IE 或 FF 中使用自定义元素 v1。

您可以使用 document-register-element v1.4:

bower install document-register-element

或者您可以使用 webcomponentsjs v1(候选发布):

bower install webcomponentsjs#v1

有了它,您将在 Chrome 和 polyfilled 之间获得一致的结果(undefined 代表 constructor()null 代表 connectedCallback()

答案是:阅读文档,并使用警告。构造函数应如下所示:

constructor(self) {
    self = super(self);
    return self;
}