ecma2015扩展类javascript
我想在ecma2015中进行一些扩展,但我似乎无法理解它是如何工作的。我用普通JavaScript编写了一个方法,就像$.extend(),但我想将代码升级到类 下面是我尝试过的示例代码ecma2015扩展类javascript,javascript,oop,ecmascript-6,Javascript,Oop,Ecmascript 6,我想在ecma2015中进行一些扩展,但我似乎无法理解它是如何工作的。我用普通JavaScript编写了一个方法,就像$.extend(),但我想将代码升级到类 下面是我尝试过的示例代码 var Test = ((window, document, undefined) => { class Defaults { constructor(options) { this.options = options || {};
var Test = ((window, document, undefined) => {
class Defaults {
constructor(options) {
this.options = options || {};
this.options.name = 'name';
this.options.age = '23';
}
}
class Test extends Defaults {
constructor(selector, options) {
super();
this.selector = document.querySelector(selector);
this.options = options;
}
createTest() {
var div = document.createElement('div');
this.selector.appendChild(div);
}
}
return Test;
})(window, document);
在我这样称呼它之后:
var test = new Test('#test', {
name: 'nameInInstance'
});
test.createTest();
document.querySelector('#test').innerHTML = JSON.stringify(test.options);
现在我看到的只是实例中的名称
为什么年龄不传给儿童班?
我遗漏了什么?您的
测试构造函数a)没有将选项传递给超级调用b)只是用参数覆盖.options
属性,不考虑任何默认值。你应该做什么
class Test extends Defaults {
constructor(selector, options) {
super(options);
this.selector = document.querySelector(selector);
}
…
也就是说,您的默认值类也没有使用最佳实践。它确实改变了它的参数,这是任何构造函数都不应该做的,最重要的是,默认值总是覆盖传入的选项,而您实际上希望它反过来。您应该手动将它们复制到:
class Defaults {
constructor(options) {
this.options = Object.assign({
name: 'name',
age: '23'
}, options);
}
}
我建议不要在这里使用继承,因为Defaults
仅用作Test
的超类,它应该被合并到它中,或者成为一个简单的助手函数;但我们假设您这样做只是为了演示。您需要调用super(options)
,但是您正在使用默认值覆盖选项。在子构造函数中,您不需要再次分配选项。因此,要从子类内部访问父类构造函数,您必须使用父构造函数中的参数调用super?如果不调用super,则无法访问子构造函数中的“this”。我是oop概念的初学者(从未在任何编程语言中实际使用过无类),我觉得这有点令人困惑……是的,您必须调用super()
,让父构造函数为您创建并初始化实例。如果不这样做,这个
是空的(这是一个新的ES6概念)。您应该为此向父构造函数传递适当的参数(取决于上下文,但通常是某种传递)。