今天复习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

用于收集当前对象不可遍历属性与可遍历属性(不包括原型链),以数组形式返回。

//getOwnPerpertyNames()能返回出不可遍历属性,keys不能
var obj={
aa:1,
to:function(){
return 1;
}
}
Object.defineProperty(obj,"name",{
value:2 //name:2
})
console.log(Object.getOwnPropertyNames(obj))//含name
console.log(Object.keys(obj));//不含name

Object.getPrototypeOf
返回参数对象的内部属性[[prototype]],就是标准浏览器的内置属性__proto__,此方法被es6推荐,es6自然不会让你随便操控一个内置的属性了。(第一参数必须为对象)。

Object.defineProperty

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

var obj={}
Object.defineProperty(obj,"a",{
value:37,
writable:false, //数据不能重写set
enumerable:false//不可被for in 用getOwnPropertyNames()得到
configurable:false //false不准删除对象属性
})
console.log( Object.getOwnPropertyDescriptor(obj,"a"));

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);//

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被污染,或极需节省内存的情况下使用。

//框架为不支持此方法模拟的Object.create()
Object.create=function(prototype,descs){
function f(){}
f.prototype=prototype;
var obj = new f();
if (descs!=null) {
Object.defineProperties(obj,descs);
};
return obj;
}

后面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);//

tips:访问属性的复制只能通过Object.defineProperty()和Object.getOwnPropertyDescriptor()完成了

大家懂了木?再来个例子

function Animal(name){
this.name=name;
}
Animal.prototype.getName=function(){
return this.name;
}
function Dog(name,age){
Animal.call(this,name);
this.age=age;
}
Dog.prototype=Object.create(Animal.prototype,{
getAge:{
value:function(){
return this.age;
}
},
setAge:{
value:function(age){
this.age=age;
}
}
})
var dog=new Dog('dog',4);
console.log(dog.name);//dog
dog.setAge(6);
sconsole.log(dog.getAge());//

那再开始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-。嘿嘿

javascript Object的新方法的更多相关文章

  1. JavaScript ES6 数组新方法 学习随笔

    JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var ...

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

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Obje ...

  3. firefox-Developer开发者站点——关于Object.create()新方法的介绍

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create Objec ...

  4. 给Object扩展新方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

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

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...

  6. javascript一种新的对象创建方式-Object.create()

    1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...

  7. 用javascript得到客户端IP的新方法

    javascript得到客户端IP的新方法 很久以来,我都是经过http://fw.qq.com/ipaddress来得到客户端用户的IP,这个方法简单.快速.实用 . 我们调用它的写法是: < ...

  8. es6 Object的几个新方法

    扩展对象 Object.preventExtensions Object.isExtensible 密封对象 Object.seal Object.isSealed 冻结对象 Object.freez ...

  9. JavaScript:Object属性方法

    Object的属性(firebug中没有找到) var pro={ city:"shanghai", list:[,,,,] } var Person=function(name, ...

随机推荐

  1. Git命令以及常见注意事项

    命令: git init -> 初始化一个git仓库 git clone -> 克隆一个本地库 git pull -> 拉取服务器最新代码 git fetch –p -> 强行 ...

  2. Redis 使用命令行的方式 获取 hash type key 的value值

    1. 之前只是非常简单的看了下 get key 和 set key 但是这样 设置的 key value 应该是都 string 类型的 2. 但是没考虑过其他类型的 是如何获取 相关内容的 ,一直 ...

  3. MyBatis的demo

    把以前写的关于mybatis的demo放在这边,以便查看. 目录结构: package com.test.mybatis.util; import java.io.IOException; impor ...

  4. Appscanner实验还原code1

    import _pickle as pickle from sklearn import svm, ensemble import random from sklearn.metrics import ...

  5. Golang的面向对象实践method

    最近在系统的学习go的语法,一切都弄好了之后准备弄个im项目出来玩.在这个过程中会把看到有趣的写法和语法啥的拿出来分析一下. 我一直以为go语言对面向对象没有支持,但是后面看到了类似类的概念,meth ...

  6. java & jdk

    java & jdk JDK 下载太慢 & java 12 https://download.oracle.com/otn-pub/java/jdk/12.0.1+12/69cfe15 ...

  7. 莫烦sklearn学习自修第七天【交叉验证】

    1. 什么是交叉验证 所谓交叉验证指的是将样本分为两组,一组为训练样本,一组为测试样本:对于哪些数据分为训练样本,哪些数据分为测试样本,进行多次拆分,每次将整个样本进行不同的拆分,对这些不同的拆分每个 ...

  8. How to remove tag on Github

    git tag -d 22 git push origin :refs/tags/22

  9. javap指令

    栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型 ...

  10. Codeforces#543 div2 B. Mike and Children(暴力?)

    题目链接:http://codeforces.com/problemset/problem/1121/B 题意 给n个数 最多的对数 其中每一对(i,j)的ai+aj都相等(不知道怎么解释.... 判 ...