{configurable:false}或Object.seal()无法正常工作

时间:2017-10-22 13:46:50

标签: javascript immutability defineproperty

我正在尝试学习javascript,并且已经看到我们可以使用对象的属性的属性。 (我的意思是可写可枚举可配置)。

根据我所学到的,我认为更改 {configurable:false} 会限制更多配置更改,例如 {writable:false,enumerable:false}

我在下面写了试一试,但我得到的结果与我预期的结果完全不同。

我对 {configurable:false} 的含义是错误的,或者代码是否有问题? TIA。

$scope.favorite = {};

$scope.favorite.checked = $window.localStorage.getItem("favorites");

if($scope.favorite.checked === null) {
    $scope.favorite.checked = true;
}

    $scope.favoriteChange = function() {
    $window.localStorage.setItem("favorites", $scope.favorite.checked);
};

1 个答案:

答案 0 :(得分:1)

MDN - seal

  

可配置属性
  可配置属性同时控制是否可以从对象中删除属性以及是否可以更改其属性(可写为false除外)

     

Object.seal()
方法密封对象,防止向其添加新属性并将所有现有属性标记为不可配置。只要它们是可写的,当前属性的值仍然可以改变。

您需要freeze

MDN - freeze

  

与Object.seal()的比较   使用Object.seal()密封的对象可以更改其现有属性。使用Object.freeze()冻结的对象中的现有属性是不可变的。



"use strict";

window.onload = function(){

  var o = {x:1};

  //Make "x" non-configurable
  Object.defineProperty(o, "x", {configurable: false});
  //freeze "o";
  Object.freeze(o);

  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: true, enumerable: true, configurable: false }
  console.log(Object.isSealed(o));
  //outputs => true

  Object.defineProperty(o, "x", {writable: true}); //Now this doesn't cause.
  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: false, enumerable: true, configurable: false }
}