ECMA262 Edition5 Object,Object的属性和方法,Object.prototype的方法.
ES5,为Object添加了一批方法.了解这些方法,可以更好的理解属性描述符的应用. 所以还是很有必要读一读的。另外,这些方法用起来还是蛮给力的.
暂时对于ES5,就只放出这些吧,希望对大家有所帮助. 此部分大量提到类似 [[getOwnProperty]]等部分可以参考 :http://www.cnblogs.com/_franky/articles/2143688.html
阅读帮助:
如果格式难以阅读,请您谅解,因为copy自evernote.排版很纠结. 您可以选择:
1. 换一个足够宽的显示器
2. 调高分辨率
3. 缩小浏览器文字尺寸.
15.2 Object对象.
15.2.1.1 Object([value]);(作为函数调用,其实抛开宿主对象,行为和 new Object没啥区别)
15.2.2 Object构造器
属性:
15.2.3 Object构造器的属性
15.2.3.1 Object.prototype
静态方法:(所有静态方法,都是ES5新增的东东.)
15.2.3.2 Object.getPrototypeOf(O)(获取参数对象的内部属性 [[Prototype]])
15.2.3.3 Object.getOwnPropertyDescriptor(O, P)
15.2.3.4 Object.getOwnPropertyNames(O)(获取指定对象的所有自身独占属性名,包括不可枚举的.并返回一个数组.)
15.2.3.5 Object.create(O [, Properties])(创建一个对象,并把该对象的[[Prototype]]设置为O.同时可以一次性添加n多属性)
15.2.3.6 Object.defineProperty(O, P, Attributes)(为制定对象,根据指定特性集,添加或设置一个属性)
15.2.3.7 Object.defineProperties(O, Properties)
15.2.3.8 Object.seal(O)
15.2.3.9 Object.freeze(O)
15.2.3.10 Object.preventExtensions(O)(就干一件事,把指定对象的内部属性[[Extensible]]设置为false,使指定对象为不可扩展状态.)
15.2.3.11 Object.isSealed(O)(判断某对象是不是密封的,如果一个对象是冻结的,那么它也一定是密封滴.)
15.2.3.12 Object.isFrozen(O)(判断某对象是不是冻结状态,即所有自身属性不可编辑,所有数据属性都只读,且该对象不可扩展.)(注3)
15.2.3.13 Object.isExtensible(O)(检查指定对象是否是可扩展滴.).(注4)
1. 如果Type(O)不是Object,或O是null,则抛出一个TypeError异常.
15.2.3.14 Object.keys(O).(获取一个以指定对象,可枚举属性名作为元素值的数组对象.)
动态方法:
15.2.4.2 Object.prototype.toString()(ES3)
15.2.4.3 Object.prototype.toLocaleString()(这个方法存基本没神马用处.更多是为了展望未来么?目前实现,最终还是去调用对象自身原型链上最前面的那个实现.ES3)
15.2.4.4 Object.prototype.valueOf() (基本可以认为就是返回 this. ES3)
15.2.4.5 Object.hasOwnProperty(V)(验证,指定对象是有有一个名为V的自身独占的属性.ES3)
15.2.4.6 Object.prototype.isPrototypeOf(V)(验证this 是不是V的原型,this是不是在V的原型链上. ES3)
15.2.4.7 Object.prototype.propertyIsEnumerable(V)(验证指定对象的指定属性,是否是可枚举的,ES3)
注1: 'franky'[0].本质就是访问 new String('franky')的名为'0'的属性.(另外new String对象,还有一个属性叫length.) 所以.getOwnPropertyNames,也要枚举出他们. 唯一要注意的是 getOwnPropertyNames,要求参数1是对象.所以你需要人肉包装箱一下. 哦不得不提一下的是. IE8居然没有对new String()实现索引器.而只对Primitive Strng实现了. 不得不说是坑爹行为啊.当然这和ES5无关.
注2: 也就是说,只有某属性是一个数据属性,才会把该属性设置为只读,否则还是要以访问器 setter 为优先. 参考下面的代码:
var _name = 'franky', obj = Object.create( Object.prototype, { name : { set : function (name) { _name = name; }, get : function () { return _name; } } } ); Object.freeze(obj); |
注3: 所谓所有数据属性都只读.是指.不理会访问器属性的状态.参考下面的代码:
var _name = 'franky' var obj = { }; Object.defineProperty(obj, 'name', {set : function (val) {_name = val;} , get : function () {return _name;}}); Object.freeze(obj); obj.name = 'wait'; Object.isFrozen(obj); // true |
注4: 对于[[Extensible]]为false的对象来说, v8引擎实现有一个有趣的bug.虽然这个也许不能称之为bug.参考下面的代码:
var obj = {}, v; Object.preventExtensions(obj);//Safari5,暂时没有实现这个接口. v = obj.name = 123; v;// chrome: undefined.
undefined. 这里 v8引擎严重有问题. 按照赋值语句的运算规则.obj.name = 123整个语句的返回值应该是 = 右边赋值表达式的返回值 ,也就是123. 那么此处v的值应该是123.
此处firefox4+,ie9的实现是正确的
这个问题的根源,根据v8的源码猜测:
C++ code:
if (!map()->is_extensible()) {
很明确,在非严格模式下,这里就是返回undefined.但为什么局部的赋值语句的返回值,没有遵守ES的赋值语句的执行过程.而是对中间的表达式进行了求值.并当做返回值呢?这显然是不合理的.
|
注5: 逻辑运算 ToObject的作用就是,如果允许,则把目标转换成一个object.并返回. 规则很简单. 如果是 undefined,或null.抛出异常,如果是一个object,则不发生转换.如果是类型是String,Number,Boolea. 则调用其对应的构造器,创建一个包装对象. 但实际上.Object.prototype.toString 是无法通过类似于 'abc'.toString()来调用的. 其toString方法都被重写了. 比如String.prototype.toString. 所以我们需要这样来调用. {}.toString.call('')或 Object.prototype.toString.call(''). 此处对于ES3来说,ToObject这一步骤在ES3中并没有明文说明.但是浏览器实现的行为,也都是与ES5所描述的,是相同的.这个很好理解了.否则浏览器实现起来就会有问题. 至少一个 'abc' 是不存在 [[Class]]内部属性的,因为他不是一个对象.
注6: 这里比较纠结.因为new Object(host object)的结果是依赖实现的.就是说返回啥,ES没有定义.完全看宿主环境实现.但绝大多数实现(我所知道的,测试过的)都是, 这个host object自身. 那么我们在一般情况下,都可以理解为,如果 O 是一个宿主对象.
注7: 第二点,是指对于早期版本,比如ES3来说 1和2的步骤是反过来的.但是我个人根本没有看出,更改顺序有什么意义. 对于toString(V)的过程.抛出异常的可能性微乎其微.所以我觉得老版本的顺序更加合理.而对于老版本来说,this的值是不可能为null 或 undefined.的,所以不可能有相关的异常出现.但就实现上来说.Safari似乎有些问题:
'use strict'; alert({}.hasOwnProperty.call(null,'a')); //无论是否在严格模式. Chrome,IE9,FF4+ 都抛出异常. 而Safari5一律返回false.这是不合理的. 这个问题产生的原因,大概和Safari5不支持严格模式有关.所以其总是保证this有一个值有关. 参考: 'use strict'; |
注8: 这里又尼玛没有明确一个问题,就是当this是 null或undefined时的行为. 参考下面的代码:
'use strict'; //开启严格模式 alert({}.isPrototypeOf.call(undefined,undefined)); 非严格模式,总是会保证一个执行环境相关联的this的值是一个对象. 比如指向global, 但是严格模式中,this的值就可能是null 或 undefined.那么ToObject(undefined),是一定要抛出异常的. |
转载于:https://www.cnblogs.com/_franky/articles/2149843.html
ECMA262 Edition5 Object,Object的属性和方法,Object.prototype的方法.相关推荐
- es6 Promise.prototype.catch()方法
Promise.prototype.catch()方法 Promise.prototype.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数. getJ ...
- ECMAScript5 Object的新属性方法
Object.create(prototype[,descriptors]) 这个方法用于创建一个对象,并把其prototype属性赋值为第一个参数,同时可以设置多个descriptors,关于dec ...
- object的部分属性和方法 + 逗号操作符 + label语句 + with + switch + 参数 + typeof和instanceof检测类型 -- 大一下第十五周
目录 object的一部分属性和方法 逗号操作符 label语句 with语句 switch语句 参数(原始值和引用值的区别) 检测类型 typeof instanceof 小记 valueOf() ...
- JavaScript深入理解对象方法——Object.entries()
Object.entries() Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in ...
- JavaScript中Object.prototype.toString方法的原理
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. <一>, ECMAScript 3 1. 在E ...
- JavaScript深入理解对象方法——Object.assign()
Object.assign() Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法 Object.assign(target, ... ...
- JavaScript:Object.prototype.toString方法的原理
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Obje ...
- OO开发思想:面向对象的开发方法(Object oriented,OO)
面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...
- ES6实用方法Object.assign、defineProperty、Symbol
文章目录 1.合并对象 - Object.assign() 介绍 进阶 注意 用途 2.定义对象 - Object.defineProperty(obj, prop, descriptor) 3.新数 ...
最新文章
- 大剑无锋之new一个对象背后发生了什么?
- Centos7下安装redis
- 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
- linux 神奇命令,Linux 命令神器:lsof 入门
- api arx autocad_应用ARX实现基于AutoCAD平台的参数化绘图
- chrome 内核CEF 编译和qt 封装(下)
- 综合安防管理系统平台服务器,DSMS智慧安防综合管理平台系统应用方案
- SpringBoot +esapi 实现防止xss攻击
- 怎样避免使用手机群控系统被封号的情况
- 闹钟Android实验报告,单片机实验报告(闹钟).doc
- Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
- ElasticSearch高级功能的使用(模版查询、地理位置查询等)
- 上半年要写的博客文章27
- Mybatis Plugin 以及Druid Filer 改写SQL
- Hive 优化(通用版)
- 安全运营四要素之资产、脆弱性、威胁和事件
- 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
- 如何提高本地文件上传至百度云的速度_上传1GB/s,下载1KB/s的原因终于找到了! | 细说网盘储存机制...
- 基于MongoDB的学生成绩数据操作
- 计算机保研统计方向,北京大学统计科学中心保研申请全解析