引子

最近读高程4的时候,发现外面有一句话“一个属性被定义为不可配置之后,就不能再变回可配置的了。再次调用Object.defineProperty()并批改任何非writable属性会导致谬误”,亲自实际之后,发现这句话的后半段说得有点问题。

当writable为true时,批改value属性不会导致谬误
let person = {};Object.defineProperty(person, "name", { configurable: false, writable: true, value: "Nicholas"});Object.defineProperty(person, "name", { value: "Twittytop"}); 
当writable为true时将它批改为false不会导致谬误(enumerable 属性不行)
let person = {};Object.defineProperty(person, "name", { configurable: false, writable: true});Object.defineProperty(person, "name", { writable: false}); 
当writable为false时将它批改为true也会导致谬误
let person = {};Object.defineProperty(person, "name", { configurable: false, value: "Nicholas"});Object.defineProperty(person, "name", { writable: true}); 

对于writable

当writable为false时,value值如果是一个数组或对象,批改外面的值将不会报错

let person = {};Object.defineProperty(person, "friend", { configurable: false, writable: false, value: ["Twittytop", "Nicholas"]});person.friend.push("Matt"); 

或者

let person = {};Object.defineProperty(person, "friend", { configurable: false, writable: false, value: {  name: "Twittytop" }});person.friend.name = "Nicholas"; 

get 和 Object.defineProperty

过后用get关键字时,它和通过Object.defineProperty定义的get属性有一些轻微的差异。

在class中,当应用get关键字时,属性将被定义在实例的原型上,而应用Object.defineProperty时,属性将被定义在实例上。

class Person { get name () {  return 'Twittytop'; }}var p = new Person();console.log(p.hasOwnProperty('name')); // falseconsole.log(Object.getPrototypeOf(p).hasOwnProperty('name')); // trueObject.defineProperty(p, 'job', { value: 'engineer'});console.log(p.hasOwnProperty('job')); // true