Object的一堆方法。。w

今天复习es6,又看到Object的一堆方法,与es5的表现又有不一致,耗费了一整天,整理一下;

前几天在司徒正美的书里又看到了es5 Object的字眼,为了向下兼容,大神们也是牛逼的整理出一系列ie仿Object方法,详情看javascript框架设计这本书(大神没有给宣传费);

这是es5的Object的方法:

Object.keys  Object.getOwnPropertyNames  Object.getPrototypeOf  Object.defineProperty  Object.defineProperties  Object.getOwnPropertyDescriptor  Object.create  Object.seal  Object.freeze  Object.preventExtensions  Object.isSealed  Object.isFrozen

Object.isExtensible 

这一堆方法看的我也是晕了,没事,我们就看看常用的(其实现在这些方法都不常用)。
Object.getOwnPropertyNames
用于收集当前对象不可遍历属性与可遍历属性(不包括原型链),以数组形式返回。
Object.getPrototypeOf
返回参数对象的内部属性[[prototype]],就是标准浏览器的内置属性__proto__,此方法被es6推荐,es6自然不会让你随便操控一个内置的属性了。

Object.defineProperty

暴露了属性描述的接口,这些接口包括能不能被遍历,可不可写,可不可删除修改等等,与后面一些方法相关。

Object.defineProperties就是Object.defineProperty的加强版给个例子就明白了

var obj={};
 Object.defineProperties(obj,{
     "value":{
         value:{
             writable:false
         },
     "name":{
         value:"Json",
         writable:false
     }
     }
 })
 var a=1;
 for(var p in obj){
     a=p;
 }
 console.log(a);//1

Object.getOwnpropertyDescriptor用于获取某对象的本地属性的配置对象。其中configurable,enumerable肯定在其中,视情况再包含value,writable或set,get

例子来啦:

 var obj={},value=0;
 Object.defineProperty(obj,
     "aaa",{
         set:function(a){
             value:a;
         },
         get:function(){
             return value
         }
 })
 console.log(Object.getOwnPropertyDescriptor(obj,"aaa"));//一个包含set,get,configurable,enumerable的对象
 console.log(typeof obj.aaa);//number
 console.log(obj.hasOwnProperty("aaa"));//true

Object.create 用于创建一个子类的原型,第一个参数为父类的原型,第二个是子类另外要添加的属性的配置对象。

 Object.create(Object.prototype,{
     {x:{
         value:1,
         writable:true,
         enumerable:true,
         configurable:true
     }}
 })

Tips:Object.create(null)还能生成一种叫纯净对象的东西,什么也没有,在Object.prototype被污染,或极需节省内存的情况下使用。
后面3个是关于约束对象的API
Object.preventExtensions: 阻止添加本地属性,允许修改原有属性,不能添加本地属性,但可以添加原型属性,本地属性可被删除。对对象约束最轻
Object.seal:不允许删除已有本地属性,不允许添加本地属性,允许修改已有属性。
Object.freeze:无疑是最专制的,他连本地属性也不让改了。内部实现就是遍历一下,把writable都改false

 var a ={aa:"aa"}
Object.freeze(a)
a.bb=2;
console.log(a.bb);//undefine
a.aa=3;
console.log(a.aa);//3

那再开始es6的介绍吧,es6其实没有多加多少属性,大部分都是推荐了es5的方法。新加的方法也很简单,稍微介绍一下(里面包含部分es5方法)。
那开始:
Object.keys(Class) 求出此类的所有方法名,不包括symbol和不可遍历属性
Object.getOwnPropertyNames(Class) 求所有属性,包括不可枚举属性,不包括symbol
Class.hasOwnProperty()返回是不是该对象的属性,如果在类的原型链上返回false
Tips:es6的__proto__指向父类,子类prototype.__proto__指向父类的prototype。

Object.setPrototypeOf设置一个对象的__proto__;
Object.setPrototypeOf的内部实现其实是

 Object.setPrototypeOf=function(obj,proto){
        obj.__proto__=proto;
        return obj;
    }

而要实现类B继承类A即为Object.setPrototypeOf(B.prototype,A.prototype);Object.setPrototypeOf(B,A);
所以可以判断此类是否继承了父类;Object.setPrototypeOf(子类)===父类;
Object.is()判断两个值是否严格相等,类似于"=="
Object.assign()这是我用的最多的方法了,经常用于复制对象,保证对象的纯净,详细了解见阮一峰的es6入门教程;
Reflect.enumerate():返回所有for in 循环所遍历的属性
Reflect.ownKeys(obj)返回一个数组,包含全部属性;

还有

ES5有三个操作会忽略enumerable为false的属性。

for...in 循环:只遍历对象自身的和继承的可枚举的属性;而ES6规定所有class原型的方法都是不可枚举的
Object.keys():返回对象自身的所有可枚举的属性的键名
JSON.stringify():只串行化对象自身的可枚举的属性
ES6新增了两个操作,会忽略enumerable为false的属性。

Object.assign():只拷贝对象自身的可枚举的属性
Reflect.enumerate():返回所有for...in循环会遍历的属性

记了这么多,重要的差不多都介绍了;好多也没举例子,不过相信聪明的你一看就懂了-0-。嘿嘿

时间: 2024-10-13 23:00:12

Object的一堆方法。。w的相关文章

[婧]学习策略的方法[w]玉林

什么是学习策略 学习策略就是指学习者在学习活动中有效的学习规则.方法.技巧及调控方式.它既可以是内隐的规则系统,也可以是外显的操作程序与步骤. 学习策略的基本涵义包括: 1.凡是有助于提高学习质量.学习效率的程序.规则.方法.技巧及调控方式都属于学习策略范畴. 2.学习策略既有内隐.外显之分,又有水平.层次之别. 3.学习策略是衡量个体学习能力的重要尺度,是制约学习效果的重要因素之一,因此也是会不会学习的标志. 4.学习策略可以通过教学来发展.虽然学习策略一般由学习者自己制定和使用,但通过教师有

理解JAVA - 面向对象(object) - 属性,方法

理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法: 面向对象,人类认知世界的方式:生活中每天都在多态:    这个人是谁,这是个人,多态来看待他了:    他是老师  把它向下造型来看待了,他是老师,知道他能讲课了,老师是人下面的子类型: 我们每天都已多态来接收事物,然后向下造型:    这是人,这人是老师:    这是车,这车是奥迪 小时候,不知到是什么,就问这是什么东西,世间万物都能成

JavaScript中Object.prototype.toString方法的原理

在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下:

Cloneable接口和Object的clone()方法

http://www.cnblogs.com/xrq730/p/4858937.html 为什么要克隆 为什么要使用克隆,这其实反映的是一个很现实的问题,假如我们有一个对象: public class SimpleObject implements Cloneable { private String str; public SimpleObject() { System.out.println("Enter SimpleObject.constructor()"); } public

JavaScript:Object.prototype.toString方法的原理

在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下: 15.2.

Object类clone方法的自我理解

网上搜帖: clone()是java.lang.Object类的protected方法,实现clone方法: 1)类自身需要实现Cloneable接口 2)需重写clone()方法,最好设置修饰符modifier为public,以便跨包调用.   浅拷贝与深拷贝 1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ⑵深复制(深克隆)被复制对象的所有变量都

java基础:Object 的toString方法

一:首先看Demo1 <strong><span style="font-size:18px;">public class Dog1{ Dog1(){ } public static void main(String[] args) { Dog1 d = new Dog1(); System.out.println(d); } }</span></strong> 输出结果: [email protected] 我们经常会看到对象的输出结果

java基础:Object的equals方法

一:看第一个例子 输出结果: false false cat1 == cat2 很简单,他们不是同一对象,有不通的存储地址. 但是cat1.equals(cat2)为什么是false呢.因为cat是对象,这里用的是父类的equals方法 而Object类equals方法的实现为: <strong><span style="font-size:18px;"> public boolean equals(Object obj) { return (this == o

j2ee Entity设计、List&lt;Object&gt;类型入库方法

1.设计类的一些技巧.很类似的东西,也可以弄两个Entity.因为很多情况下,数据库的设计与面对用于的界面是有很大不同的. 这种情况下,可以分别针对两方设计不同的entity,然后相互赋值,各自调用.会使设计思路变得更加明确. 2.针对List<Object>类型.    数据库只能是字符串(存入数据必须是json对象转换的字符串) 而entity里面无需字符串属性对应,只需要一个List<Object>即可. 但是需要手动新增一个set字符串的方法,这样java反射会自动调用该方