tamper-proof 对象 nonextensible对象 sealed对象 frozen对象

tamper-proof 对象
JavaScript的缺点之一就是每个对象都可以被相同执行上下文的代码修改,很容易导致意外覆盖,或则一不小心把native 对象覆盖。
Ecmascript  5提供了 tamper-proof 对象来解决这个问题。一旦一个对象被设为 tamper-proof 对象就无法撤销了。
下面依次介绍:

1、nonextensible对象
默认所有对象都是可拓展的,可以添加属性和方法。通过object.preventExtensions()来禁止拓展
var person = { name: “Nicholas” };
Object.preventExtensions(person);
person.age = 29;
alert(person.age); //undefined

对于原本就存在的属性是不受影响的,可以修改删除,可以通过object.isExtensible()来判断。
var person = { name: “Nicholas” };
alert(Object.isExtensible(person)); //true
Object.preventExtensions(person);
alert(Object.isExtensible(person)); //false
N

sealed对象  
对象无法拓展的同时,原有的属性无法删除,可以修改。因为它们的[[configurable]]被设为false,无法把数据属性改为存取器属性,无法使用object.defineProperty()。
var person = { name: “Nicholas” };
Object.seal(person);
person.age = 29;
alert(person.age); //undefined
delete person.name;
alert(person.name); //”Nicholas”

可以用object.isSeal()来检测是否密封了:
var person = { name: “Nicholas” };
alert(Object.isExtensible(person)); //true
alert(Object.isSealed(person)); //false
Object.seal(person);
alert(Object.isExtensible(person)); //false
alert(Object.isSealed(person)); //true
S

frozen对象
这个比以上两种更加严格,原本存在的属性都不能修改了,[[writable]]被设为false。
存取器属性只有set函数定义了的情况下才能改。
var person = { name: “Nicholas” };
Object.freeze(person);
person.age = 29;
alert(person.age); //undefined
delete person.name;
alert(person.name); //”Nicholas”
person.name = ”Greg”;
alert(person.name); //”Nicholas”

可以使用object.isFrozen()来检测:
var person = { name: “Nicholas” };
alert(Object.isExtensible(person)); //true
alert(Object.isSealed(person)); //false
alert(Object.isFrozen(person)); //false
Object.freeze(person);
alert(Object.isExtensible(person)); //false
alert(Object.isSealed(person)); //true
alert(Object.isFrozen(person)); //true

时间: 2024-10-10 21:09:13

tamper-proof 对象 nonextensible对象 sealed对象 frozen对象的相关文章

8.python之面相对象part.1(初识类与对象)

一.类和对象的概念. 什么是类 类就是把一类事物相同的特征和动作整合到一起就是类比如说"人"就是一个类. 什么是对象 对象就是基于类创建出来的一个具体存在的事物这个事物包含了将其创造出来的类的特征和动作. 类与对象有什么关系一切的对象都是由类产生的假如说造一支笔首先要有一个造笔的模版上帝制造人也是一样制造一个人也需要一个造人的模版这个模板就是人的"类"然后根据类的定义来产生一支支笔和一个个的人. 什么是实例化 由类产生对象的过程就是实例化类实例化的结果就是一个对象对

python之什么是对象值比较,什么是对象身份比较

一.对象值的比较 1.比较的操作是针对对象的值进行比较的 2.也就是说比较的是对象的值,而不是对象本身 等价于值和值的直接比较: >>> >>> 2 == 2True>>> 2.46 <= 8.33True 对象值的比较 >>> a = 88>>> b = 98>>> >>> a == bFalse>>> a >= bFalse>>>

Unity3d修炼之路:加载一个预制体,然后为该对象添加组件,然后查找对象,得到组件。

#pragma strict function Awake(){ //加载一个预制体 资源必须在 Resources文件夹下 Resources.LoadLoad(); //加载后 必须示例化 GameObject.Instantiate(); //为对象添加组件 AddComponent(); //Find游戏对象 Find(); //Get组件 GetComponent(); var pPrefab : GameObject = Resources.Load("Prefab/Scence&q

C#写入对象到XML/从XML读取对象

1.将一个sentenceresult对象写入xml,并保存 private void writeToXml(sentenceresult sr) { System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(sentenceresult)); var path = Environment.GetFolderPath(Environment.SpecialFo

数组对象元素的添加,String对象,BOM对象以及文档对象的获取

数组对象的删除有三种方法: pop();        //移除最后一个元素并返回该元素值shift();      //移除最前一个元素并返回该元素值,数组中元素自动前移splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所移除的元素通过这三种方法我们可以将数组中的元素按进行删除 var del = ["aa",23,345,56,34,"bb"]; var del_last = del.pop()

为什么Intent传递对象的时候必须要将对象序列化呢?

Intent可以算是四大组件之间的胶水,比如在Activity1与Activity2之间传递对象的时候,必须要将对象序列化, 可是为什么要将对象序列化呢? Intent在启动其他组件时,会离开当前应用程序进程,进入ActivityManagerService进程(intent.prepareToLeaveProcess()), 这也就意味着,Intent所携带的数据要能够在不同进程间传输. 首先我们知道,Android是基于Linux系统,不同进程之间的java对象是无法传输, 所以我们此处要对

JQuery选中的对象和非选中的其他对象分别执行不同动作

$("#searchWeek,#searchFifteen,#searchThirty").click(function(){ $("#searchBox").val($(this).html()); $(this).addClass('select').siblings('span').removeClass('select'); }); 选中的元素添加select class  其余的移除select class. End. JQuery选中的对象和非选中的其他

Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。

#pragma strict function Awake(){ //载入一个预制体 资源必须在 Resources目录下 Resources.LoadLoad(); //载入后 必须演示样例化 GameObject.Instantiate(); //为对象加入组件 AddComponent(); //Find游戏对象 Find(); //Get组件 GetComponent(); var pPrefab : GameObject = Resources.Load("Prefab/Scence&

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关. 举一个简单的例子,如下代码: #include <stdio.h> class A { public: int x; void foo1()