对Object.defineProperty的一点探讨

Posted Twittytop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对Object.defineProperty的一点探讨相关的知识,希望对你有一定的参考价值。

引子

最近读高程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\')); // false
console.log(Object.getPrototypeOf(p).hasOwnProperty(\'name\')); // true

Object.defineProperty(p, \'job\', {
 value: \'engineer\'
});
console.log(p.hasOwnProperty(\'job\')); // true 

以上是关于对Object.defineProperty的一点探讨的主要内容,如果未能解决你的问题,请参考以下文章

Object.defineProperty

理解Object.defineProperty的作用

Object.defineProperty()详解

Object.defineProperty()详解

理解Object.defineProperty的作用

理解Object.defineProperty的作用