有时为了保护某些属性,让其无法被更改,我们会把他们设置为常量。

在某些语言里面,也许会用const来实现这样的功能。本文讲述如何在Javascript中实现这样的功能。

方法一:

var myObject = {
get readOnlyProperty() { return 1024; }
}; alert(myObject.readOnlyProperty); //
myObject.readOnlyProperty = ; // 可以设置,但不管用
alert(myObject.readOnlyProperty); //

如果你已经定义好了一个Object,那么你可以这么做

var myObject = {};
myObject.__defineGetter__("readOnlyProperty", function() { return 1024; });

上面的这两段代码兼容Firefox,Opera 9.5+, Safari 3+和Chrom,不过杯具的是,这些代码是不兼容IE的。

方法二:

对于支持ECMAScript 5的Javascript解释器,你可以使用Object.defineProperty方法来实现这样的功能。

在松散模式,Javascript解释器会直接忽略掉属性的写入。在严格模式(strict mode)下,解释器会抛出一个错误。

var obj = {};
Object.defineProperty( obj, "<属性名>", {
value: "<属性值>",
writable: false,
enumerable: true,
configurable: true
});

不过很明显,这代码是无法在那些不支持ECMAScript 5的浏览器(当然包括IE)上执行的。

方法三:

使用模块模式去模拟出这样的功能,不废话,直接看代码

var CONFIG = (function() {
var private = {
'MY_CONST': '1',
'ANOTHER_CONST': '2'
};
  
return {
get: function(name) { return private[name]; } //函数返回一个对象,有get方法,接收name参数,返回内部私有变量的值
};
})(); alert(CONFIG.get('MY_CONST')); // CONFIG.MY_CONST = '2';
alert(CONFIG.get('MY_CONST')); // CONFIG.private.MY_CONST = '2'; // 错误,没有private属性
alert(CONFIG.get('MY_CONST')); //

这个方法兼容目前全部浏览器(包括IE),只是读属性的时候需要使用get。

方法四:

在大部分情况下,你并不需要完全控制变量不可写。在业内有个约定,就是使用全大写的字母来表示常量(只读变量)。这是最简单,最好的方法。

var MY_CONSTANT = "some-value";

这样写,来告诉自己,这个变量不可以改变!!!

总结:

我个人比较推荐最后一种做法。简单明了,约定 也是解决很多问题的最好方法。

其次是方法三,模块模式是比较好的模式,而且这种方法兼容性良好,因为我想大部分人用Javascript都是需要在IE上运行的。

第二种方法是标准方法,如果以后Javascript解释器都支持ECMAScript 5的话。

本文参考:stackoverflow.com

Javascript设置对象属性为"只读"的更多相关文章

  1. Python面向对象基础:设置对象属性

    用类存储数据 类实际上就是一个数据结构,对于python而言,它是一个类似于字典的结构.当根据类创建了对象之后,这个对象就有了一个数据结构,包含一些赋值了的属性.在这一点上,它和其它语言的struct ...

  2. JavaScript 访问对象属性和方法及区别

    这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...

  3. C#通过属性名字符串获取、设置对象属性值

    之前理工项目从这个博客找到了相对应的方法:C#通过属性名字符串获取.设置对象属性值 https://www.cnblogs.com/willingtolove/p/12198871.html

  4. JavaScript 操作对象属性(设置属性, setter/getter, 序列化)

    参考自<<JavaScript权威指南 第6版>>, 文字太多反而不易理清其中的关系, 直接上代码和注释 /* * 对象的setter和getter属性: * 定义为一个或者两 ...

  5. javascript window对象属性和方法

    window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的 ...

  6. JavaScript原生对象属性和方法详解——Array对象

    http://www.feeldesignstudio.com/2013/09/native-javascript-object-properties-and-methods-array/ lengt ...

  7. javascript中对象属性的介绍

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. JavaScript 之 对象属性的特性 和defineProperty方法

    对象是无序属性的集合,而这些属性在创建是都带有一些特征值(可以理解为属性的属性,天生自带的),这些特征值是为了实现JavaScript引擎用的,因此JavaScript不能直接访问. JavaScri ...

  9. JavaScript Window对象属性

    window 代表浏览器中一个打开的窗口. Window的属性 属性 描述 closed 获取引用窗口是否已关闭. defaultStatus 设置或获取要在窗口底部的状态栏上显示的缺省信息. dia ...

随机推荐

  1. 【转载】 mysql explain用法

    转载链接:  mysql explain用法 官网说明:     http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数:  htt ...

  2. EF不能很好的支持DDD?估计是我们搞错了!

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在ABP项目中尝试纯粹的DDD,然后遇到EF实现的Repository似乎不能很好 ...

  3. 优化Linux内核参数

    转自:http://www.centoscn.com/CentOS/config/2013/0804/992.html vim /etc/sysctl.conf 1.net.ipv4.tcp_max_ ...

  4. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  5. Android 利用ImageView显示图片

    Author: Maddock Date: 2015-07-21 因为做算法demo的需要,开发一点安卓的程序. 需求:获取UI中图像中某点的坐标. 参考:http://longshuai2007.b ...

  6. fragment嵌套问题

    fragment嵌套里面不能用再用getActivity().getFragmentManager()要用getChildFragmentManager()

  7. 网络神器Greasemonkey(油猴子)使用方法简介+脚本分享【转载】

    推荐下,觉得这个方法有用, 今天艾薇百科来介绍一下功能强大的Greasemonkey,俗称"油猴子",Greasemonkey可以自由定制网页,实现你想要的各种功能.堪称" ...

  8. 转:看看 Delphi XE2 为 VCL 提供的 14 种样式

    http://www.linuxso.com/linuxbiancheng/8889.html 其实只提供了 个 vsf 样式文件, 还有默认的 Windows 样式, 共 种. 在空白窗体上添加 L ...

  9. Linux 利用lsof命令恢复删除的文件

    lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需 ...

  10. iOS CoreData primitive accessor

    Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...