我的回答

  1. function freeze() {
  2. const keys = Object.keys(this)
  3. if (keys.length > 0) {
  4. keys.forEach(key => {
  5. Object.defineProperty(this, key, {
  6. enumerable: false,
  7. writable: false,
  8. configurable: false,
  9. }),
  10. freeze(this[key])
  11. })
  12. }
  13. }
  14. Object.prototype.freeze = freeze

参考回答

Object.freeze方法可以冻结一个对象,冻结是指不能向这个对象添加新的属性,不能修改现有属性的值,不能删除属性,甚至不能修改这个对象现有属性的可枚举性、可配置性、可写性。换句话说,这个对象永远是不可变的,此方法返回被冻结的对象。
Object.freeze是浅冻结

  1. const obj = {
  2. name: "zf",
  3. address: {
  4. city: "beijing",
  5. },
  6. };
  7. const freezeObj = Object.freeze(obj);
  8. freezeObj.name = "new name";
  9. console.log(freezeObj.name); // 仍然是zf
  10. // 严格模式会报错
  11. ("use strict");
  12. freezeObj.name = "new name"; // TypeError
  13. //Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
  14. // 但是address 是没有被冻结的
  15. freezeObj.info.age= 12;
  16. console.log(freezeObj.info.age); // 12

简单实现的代码

  1. function myFreeze(obj) {
  2. // 判断参数是否为Object类型
  3. if (obj instanceof Object) {
  4. for (let key in obj) {
  5. if (obj.hasOwnProperty(key)) {
  6. Object.defineProperty(obj, key, {
  7. writable: false, // 设置只读
  8. });
  9. Object.seal(obj); // 封闭对象
  10. }
  11. }
  12. }
  13. return obj;
  14. }
  • Object.defineProperty()方法定义对象属性的特性,比如是否删除,是否修改,是否可枚举等
  • Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置