javascript - 数组作为 JavaScript 中 protected 对象属性

标签 javascript arrays protected

我正在尝试构建一个 JavaScript 构造函数,它具有一个数组作为具有只读访问权限的属性:

var Word = function() {
  var _occurrences = [];
  Object.defineProperties(this, {
    "occurrences": {
      get: function() {
        return _occurrences;
      }
    },
    "addOccurence": {
      value: function(occ) {
        _occurrences.push(occ);
      }
    }
  });
};

数组本身是一个私有(private)变量,有一个 get-er 指向它。

var myWord = new Word();
myWord.addOccurrence(123);
var occ = myWord.occurrences;

一切正常。

myWord.occurrences = [];

被阻止,这是应该的。但令人惊讶的是,这有效:

myWord.occurrences.push(321);

保护一个属性可以防止它被新赋值,但不能通过 Array 方法进行写访问——即使它只能通过 getter 访问。这使得 Object.defineProperty() 对我来说毫无意义。

Object.freeze()/Object.seal() 不是一个选项,因为我的 addOccurrences() 方法需要写权限.

有什么想法吗?我是否忽略了什么?

最佳答案

JavaScript 只为您提供对对象(包括数组)的引用。当您返回 _occurrences 时,您返回了对数组的引用,因此您可以对其进行操作。

如果你想阻止这种情况,返回一个数组的副本。

return _occurrences.concat();

关于javascript - 数组作为 JavaScript 中 protected 对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24307897/

相关文章:

Java - 二维整数数组的多级排序

arrays - 关联数组中的错误数组下标错误

android - 如何播放mp3数组中的音频[Android]

c++ - 继承期间无法访问基址

javascript - 按需运行 AngularJS 指令

javascript - 循环输入字段时设置标志

javascript - 使用 jQuery 获取表格内的文本框值

javascript - Angular ng-class中的css过渡淡入淡出

typescript - 是否有计划将 Protected 添加到 typescript

c# - 抽象类的可访问性不一致