《JS权威指南学习总结--6.7属性的特性》
内容要点:
一.ES5中查询和设置属性的API
1.可以通过这些API给原型对象添加方法,并将它们设置成不可枚举的,这让它们看起来更像内置方法。
2.可以通过这些API给对象定义不能修改或删除的属性,借此 "锁定" 这个对象。
3.数据属性的4个特性: 值(value)、可写性(writable)、可枚举性(enumerable)和可配置性(configurable)。
4.存取器属性不具有值特性和可写性,它们的可写性是由setter方法存在与否决定的。因此存取器属性的4个特性是:读取(get)、写入(set)、可枚举性(numberable)和可配置性(configurable)。
其中writable、enumerable和configurable都是布尔值,当然,get属性和set属性是函数值。
二.Object.getOwnPropertyDescriptor()
1.通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符:
例如:
//返回{ value : 1,writable : true,enumerable:true,configurable:true }
Object.getOwnPropertyDescriptor({x:1},"x");
//查询上文中定义的random对象的octet属性
//返回{get:/*func*/,set:undefined,enumerable:true,configurable:true}
Object.getOwmPropertyDescriptor(random,"octet");
//对于继承属性和不存在的属性,返回undefined
Object.getOwnPropertyDescriptor({},"x"); //undefined,没有这个属性
Object.getOwnPropertyDescriptor({},"toString"); //undefined,继承属性
Object.getOwnPropertyDescriptor()只能得到自有属性的描述符。要想获得继承属性的特性,需要遍历原型链
三.Object.definePeoperty()
传入要修改的对象,要创建或修改的属性的名称以及属性描述符对象。
var o = {}; //创建一个空对象
//添加一个不可枚举的数据属性x,并赋值为1
Object.defineProperty(o,"x",{value:1,writable:true,enumerable:false,configurable:true});
//属性是存在的,但不可枚举
o.x; //=>1
Object.keys(o) //=>[]
//现在对属性x做修改,让它变为只读
Object.defineProperty(o,"x",{writable:false});
//试图更改这个属性的值
o.x = 2; //操作失败但不报错,而在严格模式中抛出类型错误异常
o.x=1;
//属性依然是可配置的,因此可以通过这种方式对它进行修改
Object.defineProperty(o,"x",{value:2});
o.x //=>2
//现在将x从数据属性修改为存取器属性
Object.defineProperty(o,"x",{get:function(){return 0;}});
o.x //=>0
传入Object.defineProperty()的属性描述符对象不必包含所有4个特性。对于新创建的属性来说,默认的特性值是false或undefined。对于修改的已有属性来说,默认的特性值没有做任何修改。注意:这个方法要么修改已有属性要么新建自有属性,但不能修改继承属性。
四.Object.defineProperties()
同时修改或创建多个属性。第一个参数是要修改的对象,第二个参数是一个映射表,它包含要新建或修改的属性的名称,以及它们的属性描述符
例如:
var p = Object.defineProperties({},{
x:{value:1,writable:true,enumerable:true,configurable:true},
y:{value:1,writable:true,enumerable:true,configurable:true},
r:{
get:function(){ return Math.sqrt(this.x*this.x+this.y*this.y) },
enumerable:true,
configurable:true
}
});
这段代码从一个空对象开始,然后给它添加了两个数据属性和一个只读存储器属性,最终Object.defineProperties()返回修改后的对象
五.
对于那些不允许创建或修改的属性来说,如果用Object.defineProperty()和Object.defineProperties()返回修改后的对象(新建或修改)就会抛出类型错误异常,
比如,给一个不可扩展的对象新增属性就会抛出类型错误异常。造成这些方法抛出类型错误异常的其他原因则和特性本身相关。
可写性控制着特性的修改,可配置性控制着对其他特性的(包括属性是否可以删除)的修改。然而规则远不止这么简单:
例如,如果属性是可配置的话,则可以修改不可写属性的值。同样,如果属性是不可配置的,仍然可以将可写属性修改为不可写属性。
下面是完整的规则,任何对Object.defineProperty()或Object.defineProperties()违反规则的使用都会抛出类型错误异常
1.如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性
2.如果属性是不可配置的,则不能修改它的可配置性和可枚举性。
3.如果存取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转换为数据属性
4.如果数据属性是不可配置的,则不能将它转换为存取器属性
5.如果数据属性是不可配置的,则不能将它的可写性从false修改为true,但可以从true修改为false。
6.如果数据属性是不可配置的且不可写的,则不能修改它的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)
六.
上节中实现了extend()函数,这个函数把一个对象的属性复制到另一个对象中。这个函数只是简单地复制属性名和值,没有复制属性的特性,而且也没有复制存取器属性的getter和setter方法,只是将它们简单地转换为静态的数据属性。
下例给出了改进的extend(),它使用Object.getOwnPropertyDescriptor()和Object.defineProperty()对属性的所有特性进行复制。新的extend()作为不可枚举属性添加到Object.prototype中,因此它是Object上定义的新方法,而不是独立的函数。
/*给Object.prototype添加一个不可枚举的extend()方法
*这个方法继承自调用它的对象,将作为参数传入的对象的属性一一复制
*除了值之外,也复制属性的所有特性,除非在目标对象中存在同名的属性
*参数对象的所有自有对象(包括不可枚举的属性)也会一一复制
*/
Object.defineProperty(Object.prototype,
"extend",
{
writable: true,
enumerable:false, //将其定义为不可枚举的
configurable:true,
value:function(o){ //值就是这个函数
//得到所有的自有属性,包括不可枚举属性
var names = Object.getOwnPropertyNames(o);
//遍历它们
for(var i = 0; i <names.length; i++){
//如果属性已经存在,则跳过
if(names[i] in this) continue;
//获得o中的属性的描述符
var desc = Object.getOwnPropertyDescriptor(o,names[i]);
//用它给this创建一个属性
Object.defineProperty(this,names[i],desc);
}
}
});
转载于:https://www.cnblogs.com/hanxuming/p/5795441.html
《JS权威指南学习总结--6.7属性的特性》相关推荐
- ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- 信息学奥赛真题解析(玩具谜题)
玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...
- 信息学奥赛之初赛 第1轮 讲解(01-08课)
信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...
- 信息学奥赛一本通习题答案(五)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通习题答案(三)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通题目代码(非题库)
为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...
- 信息学奥赛一本通(C++版) 刷题 记录
总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...
- 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离
首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...
最新文章
- linux脚本读取mssql数据库,WebShell通过SQL语句管理MSSQL
- Apache如何将HTTP重定向到HTTPS
- 孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法
- 「HDU6158」 The Designer(圆的反演)
- JStrom 入门(三) 上传jar文件并启动流程
- extjs入门(06) 按钮占两行
- 分享百度文库提交成功的八大因素
- Java实现动画逐字打印
- 【转】win7 32位安装oracle10g步骤
- OSChina 周一乱弹 —— 程序员的浪漫你不懂
- 免费文件分发服务器,文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research...
- Windows 重装系统后 开发环境配置 软件安装列表
- 苹果手机显示服务器返回数据异常,iOS 请求数据 返回-9843 的错误
- Jdk14其他新特性
- SemanticKITTI 数据集(ICCV 2019)
- 为什么《大长今》是湖南卫视引入的?
- 2017春招实习总结
- libgdx和android界面结合,Android游戏引擎libgdx使用教程11:Skin和UI配置文件
- Force Logging参数详解
- 如何在本地上次文件到GitHub
热门文章
- 【CCFCSP- 201312-4】有趣的数(线性dp)
- 【CodeForces - 215A】Bicycle Chain (水题)
- 【HDU - 2255】奔小康赚大钱(KM算法模板,二分图最优匹配)
- 【HDU - 2066】:一个人的旅行(Dijkstra算法)
- 玛纽尔扫地机器人怎样_扫地机器人哪个牌子好?满足日常清洁需求才值得推荐...
- 计算机测试怎么提交,Win7电脑怎么测试上传速度?
- http协议与服务器通信,iPhone应用用HTTP协议和服务器通信
- 大学计算机二级培训蹭课,本人在复旦大学蹭课总结的一点小小的经验
- 计算机网络技术基础教学内容,计算机网络技术基础
- matlab中云模型,云模型简介与个人理解matlab程序.doc