我想使用getter&原型模式中的setter。我通过将Object.defineProperty放在构造函数中来完成此操作。
我知道我可以在原型对象中创建getWhatever()方法,我喜欢通过真实的getter / setter访问属性的简洁
但是像这样在原型对象之外使用defineProperty对我来说并不合适。还有更好的方法吗?
function Person(name) {
this._name = name;
Object.defineProperty(this, 'name', {
get: function() {
return this._name;
}
});
}
the plunk:https://plnkr.co/edit/h3tgJjQBGspepdho3lqJ?p=preview
答案 0 :(得分:0)
为什么不在原型上做呢?
{{1}}
答案 1 :(得分:0)
ES6类与模块结合使用,可以使用原型上的 getters 创建真正的私有成员。
WeakMap对象是键/值对的集合,其中 键仅是对象,并且值可以是任意值。-MDN
const _name = new WeakMap();
class Person {
constructor(name) {
_name.set(this, name); // Set key to THIS and value to name.
}
// Members in class body are automatically on prototype.
get name() {
return _name.get(this); // Get value (name) via key (THIS).
}
}
const p = new Person('Betti');
p.name; // Betti
p.name = 'Toni';
p.name; // Betti
为防止访问名称WeakMap,我们可以将其与person类一起放在其自己的模块中(单独的文件,例如person.js)。 然后,我们仅导出类,因此无法访问WeakMap。
在person.js中:
const _name = new WeakMap();
export class Person { ... }
并将其导入到我们需要课程的任何地方。
在script.js中:
import {Person} from './person';
不使用Webpack的解决方法:
在人后添加“ .js”
import {Person} from './person.js';
并在我们的html文件中,将脚本类型更改为“模块”
<script type="module" src="script.js"></script>
(不确定在生产中是否建议解决方法,最好使用Webpack)
来源:Moshes JS OOP课程。