吸气剂和在原型模式中的二传手

时间:2016-06-28 18:21:17

标签: javascript prototype getter-setter

我想使用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

2 个答案:

答案 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课程。