Javascript设置对象属性为"只读"
有时为了保护某些属性,让其无法被更改,我们会把他们设置为常量。
在某些语言里面,也许会用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设置对象属性为"只读"的更多相关文章
- Python面向对象基础:设置对象属性
用类存储数据 类实际上就是一个数据结构,对于python而言,它是一个类似于字典的结构.当根据类创建了对象之后,这个对象就有了一个数据结构,包含一些赋值了的属性.在这一点上,它和其它语言的struct ...
- JavaScript 访问对象属性和方法及区别
这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...
- C#通过属性名字符串获取、设置对象属性值
之前理工项目从这个博客找到了相对应的方法:C#通过属性名字符串获取.设置对象属性值 https://www.cnblogs.com/willingtolove/p/12198871.html
- JavaScript 操作对象属性(设置属性, setter/getter, 序列化)
参考自<<JavaScript权威指南 第6版>>, 文字太多反而不易理清其中的关系, 直接上代码和注释 /* * 对象的setter和getter属性: * 定义为一个或者两 ...
- javascript window对象属性和方法
window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的 ...
- JavaScript原生对象属性和方法详解——Array对象
http://www.feeldesignstudio.com/2013/09/native-javascript-object-properties-and-methods-array/ lengt ...
- javascript中对象属性的介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript 之 对象属性的特性 和defineProperty方法
对象是无序属性的集合,而这些属性在创建是都带有一些特征值(可以理解为属性的属性,天生自带的),这些特征值是为了实现JavaScript引擎用的,因此JavaScript不能直接访问. JavaScri ...
- JavaScript Window对象属性
window 代表浏览器中一个打开的窗口. Window的属性 属性 描述 closed 获取引用窗口是否已关闭. defaultStatus 设置或获取要在窗口底部的状态栏上显示的缺省信息. dia ...
随机推荐
- yum 源
epel 6源: cd /usr/local/src wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noar ...
- Python帮助文档中Iteration iterator iterable 的理解
iteration这个单词,是循环,迭代的意思.也就是说,一次又一次地重复做某件事,叫做iteration.所以很多语言里面,循环的循环变量叫i,就是因为这个iteration. iteration指 ...
- FFT与乒乓球
刚刚打乒乓球的时候,看到一个旋球.想起<傅里叶分析之掐死教程>: “正弦曲线波叠加出一个带90度角的矩形波来” 我们把多个旋叠加在一起,是不是就可以让这个球跳舞了呢?
- Java基础知识点4:继承
继承是面向对象编程技术中非常重要的一个基本概念.它背后的基本思想就是:通过已有的类来创建一个新的类,这个新的类可以重用(或继承)已有的类方法:新的类也可以加入新的方法和属性. 在这里我们通过一个实例来 ...
- 大话css之display的Block未解之谜(一)
用了几年的css了,css中inline | block |inline-block|table|flex从来没有做过系统的整理和分析,网上的分析文章也很多,零散. 今天有空,就在这做一下整理分析 b ...
- 《DSP using MATLAB》示例Example5.23
代码: conv_time = zeros(1,150); fft_time = zeros(1, 150); % % Nmax = 2048; for L = 1:150 tc = 0; tf = ...
- 【字符串匹配】KMP算法和next数组的c/c++实现
KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看 ...
- Java 语句循环
编写程序,显示Welcome to Java 五次. public class Welcome{ public static void main(String[] args){ int i;(定义变量 ...
- bzoj1001最小割
听说最大流过不去??? dinic果然神了,1000,000的点都能过(主要是比较稀疏) #include <cstdio> #define INF 9223372036854775807 ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...