总能看到get 和 set 需要入个门

//第一种声明方式: 这是mdn上面的案例
var language = {
  set current(name) {
    this.log.push(name);
  },
  log: []
}
//删除了current属性
delete o.current;
//第二种声明方式: 已经存在的对象这么干
var o = {a: 0};
Object.defineProperty(o, 'b', { set: function(x) { this.a = x / 2; } });

var expr = 'foo';
var obj = {
  baz: 'bar',
  set [expr](v) { this.baz = v; }
};
obj.foo = 'baz';      // run the setter
//第2.5方式: 这个是复数形式
Object.defineProperties(test, {
  o: {
     get() {},
     set(v) {}
  },
  p: {
    get() {},
    set(v) {}
  }
});
//第三种声明方式: 废弃的不支持的方式.
Object.prototype.__defineGetter__和Object.prototype.__defineSetter__

这货就是个语法糖啊, js是吃糖上瘾了吧……

一个案例:

var foo = (function(){ 
    var o = {
       a: 1,
       b: 2,
       /**更多属性**/
    };
    return function(key) { //foo是一个function
        return o[key];
    }
})();

var key = Symbol(); //这个货不能放到json里面是一个语言级运行时唯一, 不会被for in遍历, 可以搞私有属性. 参考: https://segmentfault.com/a/1190000018522663
Object.defineProperty(Object.prototype, key, {
    get() {
        return this;
    }
});

var o = foo(key);
console.log(Object.keys(o)); // ['a', 'b']

这个文章很清晰: https://zhuanlan.zhihu.com/p/25672454