使用静态方法的JS类没有看到静态setter

时间:2016-03-17 13:15:43

标签: javascript class static ecmascript-6

我有这个简单的代码 -

class Repo {
    constructor(someParam = null) {
        this.getDic = someParam;
    }
    static set getDic(ref){
        this.ref = ref;
    }
    static get getDic(){
        return this.ref;
    }
    static key(key){
        return this.getDic[key];
    }
}

let newRepo = new Repo({yeah: 'baby'});
Repo.key('yeah') // Uncaught TypeError: Cannot read property 'yeah' of undefined

为什么'key'静态方法中的'getDic'getter未定义?

谢谢!

2 个答案:

答案 0 :(得分:3)

当您在类中定义static属性时,会将其绑定到constructor,因此当您执行new Repo()不包含static方法但new Repo().constructor的返回值时1}}将包含static方法

let newRepo = new Repo({yeah: 'baby'});
Repo.key // define
newRepo.key // not define
newRepo.constructor.key // define

和另一件事:Repo.key === newRepo.constructor.key。因此,通过创建static属性(与c#等其他语言一样),该属性在范围内存在一次。但这是所有其他问题:)

修改

您的代码无效的原因是您使用get属性作为function

通过将set键放在函数属性之前,您将函数设置为set属性...这意味着该函数已在{get上设置Object.definePropery 1}}

让我们看一下使用babel转换es6

'use strict';

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Repo = function () {
    function Repo() {
        var someParam = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0];

        _classCallCheck(this, Repo);

        this.getDic = someParam;
    }

    _createClass(Repo, null, [{
        key: 'key',
        value: function key(_key) {
            console.log(this.constructor.getDic);
            return this.getDic[_key];
        }
    }, {
        key: 'getDic',
        set: function set(ref) {
            this.ref = ref;
        },
        get: function get() {
            return this.ref;
        }
    }]);

    return Repo;
}();

var newRepo = new Repo({ yeah: 'baby' });
Repo.key('yeah'); // Uncaught TypeError: Cannot read property 'yeah' of undefined

长篇故事只需使用Repo.key = 'heya',你就可以了

答案 1 :(得分:0)

我有一个非常相似的问题;事实证明this并没有像您期望的那样引用静态类。使用实际的类名可以对其进行修复。所以:

class Repo {
    . . .
    static key(key){
        return Repo.getDic[key];
    }
}

通过将this换成类名,它应该可以正常工作。