我有这个简单的代码 -
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未定义?
谢谢!
答案 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
换成类名,它应该可以正常工作。