Using Object.defineProperty with Angular throws TypeError: Cannot assign to read only property (property) of #<Object>
Using Object.defineProperty with Angular throws TypeError: Cannot assign to read only property (property) of #<Object>
我的范围内有一个对象,我希望该对象具有一些不可枚举的属性,但是在将可枚举描述符设置为 false 之后,每当我尝试更改该值时,我都会得到:
"TypeError: Cannot assign to read only property (property) of #"
...即使我专门将它的可写和可配置描述符设置为 true。为什么会发生这种情况,我该如何解决?
在非严格模式下它不会抛出错误,它只是什么都不做。
根据以下内容,这应该可以正常工作:MDN ...
代码:
'use strict'
angular.module('app', []);
angular.module('app').controller('TestingCtrl',['$scope', function($scope){
var that = this;
this.content = { contentArea: {} };
function updateIsEmpty(){
that.content.contentArea.isEmpty = Object.keys(that.content.contentArea).length === 0;
console.log(that.content.contentArea)
console.log(Object.keys(that.content.contentArea));
}
this.addSomethingToCA = function(val){
that.content.contentArea.something = val;
updateIsEmpty();
};
this.removeSomethingFromCA = function(){
delete that.content.contentArea.something;
updateIsEmpty();
};
(function init(){
Object.defineProperty(that.content.contentArea, 'isEmpty', {
enumerable: false
, value: true
, configurable: true
, writeable: true
});
})();
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js"></script>
<div ng-app="app">
<div ng-controller="TestingCtrl as testingctrl">
<button ng-if="testingctrl.content.contentArea.isEmpty === true"
ng-click="testingctrl.addSomethingToCA('is weird')">add something</button>
<button ng-click="testingctrl.removeSomethingFromCA()">remove something</button>
<ul>
<li ng-repeat="(key, val) in testingctrl.content.contentArea">
key: {{ key }}
val: {{ val }}
</li>
</ul>
</div>
</div>
如果你运行上面的代码片段它会抛出:
类型错误:
Cannot assign to read only property 'isEmpty' of #<Object>
at updateIsEmpty (http://stacksnippets.net/js:35:38)
at removeSomethingFromCA (http://stacksnippets.net/js:46:5)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:161:190
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:178:83
at h.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:101:273)
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:102:48)
at HTMLButtonElement.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:178:65)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:27:15
at Array.forEach (native)
at q (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:7:255)
你打错了。 属性 描述符中的 writeable
键应该是 writable
.
我的范围内有一个对象,我希望该对象具有一些不可枚举的属性,但是在将可枚举描述符设置为 false 之后,每当我尝试更改该值时,我都会得到: "TypeError: Cannot assign to read only property (property) of #"
...即使我专门将它的可写和可配置描述符设置为 true。为什么会发生这种情况,我该如何解决? 在非严格模式下它不会抛出错误,它只是什么都不做。 根据以下内容,这应该可以正常工作:MDN ...
代码:
'use strict'
angular.module('app', []);
angular.module('app').controller('TestingCtrl',['$scope', function($scope){
var that = this;
this.content = { contentArea: {} };
function updateIsEmpty(){
that.content.contentArea.isEmpty = Object.keys(that.content.contentArea).length === 0;
console.log(that.content.contentArea)
console.log(Object.keys(that.content.contentArea));
}
this.addSomethingToCA = function(val){
that.content.contentArea.something = val;
updateIsEmpty();
};
this.removeSomethingFromCA = function(){
delete that.content.contentArea.something;
updateIsEmpty();
};
(function init(){
Object.defineProperty(that.content.contentArea, 'isEmpty', {
enumerable: false
, value: true
, configurable: true
, writeable: true
});
})();
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js"></script>
<div ng-app="app">
<div ng-controller="TestingCtrl as testingctrl">
<button ng-if="testingctrl.content.contentArea.isEmpty === true"
ng-click="testingctrl.addSomethingToCA('is weird')">add something</button>
<button ng-click="testingctrl.removeSomethingFromCA()">remove something</button>
<ul>
<li ng-repeat="(key, val) in testingctrl.content.contentArea">
key: {{ key }}
val: {{ val }}
</li>
</ul>
</div>
</div>
如果你运行上面的代码片段它会抛出: 类型错误:
Cannot assign to read only property 'isEmpty' of #<Object>
at updateIsEmpty (http://stacksnippets.net/js:35:38)
at removeSomethingFromCA (http://stacksnippets.net/js:46:5)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:161:190
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:178:83
at h.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:101:273)
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:102:48)
at HTMLButtonElement.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:178:65)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:27:15
at Array.forEach (native)
at q (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js:7:255)
你打错了。 属性 描述符中的 writeable
键应该是 writable
.