Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ecma2015扩展类javascript_Javascript_Oop_Ecmascript 6 - Fatal编程技术网

ecma2015扩展类javascript

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 || {};

我想在ecma2015中进行一些扩展,但我似乎无法理解它是如何工作的。我用普通JavaScript编写了一个方法,就像$.extend(),但我想将代码升级到类

下面是我尝试过的示例代码

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概念)。您应该为此向父构造函数传递适当的参数(取决于上下文,但通常是某种传递)。