javascript - 防止使用 setter 进行访问

标签 javascript setter

问题是防止从对象外部覆盖。

我的想法是使用 setter :

var spot = function(val){
    this.id = val;
    this.__defineSetter__("id", function(val){alert("bang");});
}

id 应在构造函数中设置一次,并且永远不会更改。 我还想在原型(prototype)上定义 setter,因为我有 10,000 个点。但在这种情况下,setter 也阻止对构造函数的访问。

我不愿意在构造函数中使用var id并在其上定义一个getter。在这种情况下,(10.000)个对象中的每一个都有自己的闭包。

第二个问题是:setter 能否以某种方式知道 var 是从构造函数更改还是稍后从(现场)内部函数更改?所以我可以阻止仅从对象外部进行访问。

最佳答案

首先,该代码是非标准的并且已被弃用。根据您正在开发的平台,我建议使用 preventExtensionsfreeze 。或者您可能只想将 id 属性定义为只读,在这种情况下使用 defineProperty .

其次,正如您所做的那样,spot 的每个实例都已经有了自己的闭包。您定义的 setter 是一个独特的函数 + 词法范围,它将存在于每个位置,也称为闭包。所以我不确定制作 setter/getter 有什么大不了的。尽管第一点在这里胜出,但您应该使用新方法来实现该功能。

最后,无论你采取什么方向,设置者都无法“知道”任何事情。因此,您可以拥有一个单独的变量,与 isInitialized 相匹配,或者创建一个代码不变式,以便该值首先是 undefined,然后是数字,这允许简单检查变量是否具有已定义的值,在这种情况下它已被设置,并且不应再次设置。

关于javascript - 防止使用 setter 进行访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6690443/

相关文章:

Java Selenium 化物 : How to use annotation @Setter for adding String to xpath

Java 不断跳过我的扫描仪对象

javascript - 使用 Hammer.js 2.0.4 在当前平移期间强制 "panend"

javascript - 使用 fs 读取文件后解析 Json

javascript - D3.js 图表转换错误

javascript - 清除除某些之外的所有 html 控件

用于预渲染/预取空白页面的 JavaScript 计时器

python - 为什么@var.setter函数不能访问类变量?

java - 设置方法或构造函数

c++ - 如何制作不可访问的类变量