Object 的静态方法
所谓的Object静态方法就是部署在Object对象本身的一些方法
Object.keys()
Object.getOwnPropertyNames()
这两种方法都是用来遍历对象属性
Object.keys()参数是一个对象 返回的是一个数组 数组里包含的都是该对象的属性名。

Object.getOwnPropertyNames方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。
对于一般的对象来说,Object.keys()和Object.getOwnPropertyNames()返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys方法只返回可枚举的属性 ,Object.getOwnPropertyNames方法还返回不可枚举的属性名。
什么是不可枚举属性?举个栗子~(不可枚举属性)

由于 JavaScript 没有提供计算对象属性个数的方法,所以可以用这两个方法代替
Object.keys().length
Object.getOwnPropertyNames().length
一般情况下,几乎总是使用Object.keys方法,遍历对象的属性。
其他方法
除了上述的两个方法外 Object还有很多静态方法 就不一一展开了不是很常用 但是列出来 了解一下 知道有这些方法 脑袋里有个印象
1.对象属性模型的相关方法
Object.getOwnPropertyDescriptor() 获取某个属性的描述对象
Object.defineProperty() 通过描述对象,定义某个属性
Object.definePropertys() 通过描述对象,定义多个属性
2.控制对象状态的方法
Object.preventExtensions() 防止对象扩展
Object.isExtensible() 判断对象是否可扩展
Object.seal() 禁止对象配置
Object.isSealed() 判断一个对象是否可配置
Object.freeze() 冻结一个对象
Object.isFrozen() 判断一个对象是否被冻结
3.原型相关的方法
Object.create() 该方法可以指定原型对象和属性,返回一个新的对象
Object.getPrototypeOf() 获取对象的Prototype对象
Object 的实例方法
除了静态方法,还有不少方法定义在Object.prototype对象。它们称为实例方法,所有Object的实例对象都继承了这些方法。主要以下六个:
Object.prototype.valueOf()返回当前对象对应的值。
Object.prototype.toString()返回当前对象对应的字符串形式
Object.prototype.toLocaleString()返回当前对象对应的本地字符串形式
Object.prototype.hasOwnProperty()判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性
Object.prototype.isPrototypeOf()判断当前对象是否为另一个对象的原型
Object.prototype.propertyIsEnumerable()判断某个属性是否可枚举
Object.prototype.valueOf()
valueOf方法的作用是返回一个对象的“值”,默认情况下返回对象本身。

valueOf方法的主要用途是,JavaScript 自动类型转换时会默认调用这个方法 举个例子:

上面代码将对象obj99与数字1相加,这时 JavaScript 就会默认调用valueOf()方法,求出obj99的值再与1相加。所以,如果自定义valueOf方法,就可以得到想要的结果。这种方法就相当于用自定义的obj.valueOf,覆盖Object.prototype.valueOf。
Object.prototype.toString()
toString方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串。

上面代码表示,对于一个对象调用toString方法,会返回字符串[object Object],该字符串说明对象的类型。字符串[object Object]本身没有太大的用处,但是通过自定义toString方法,可以让对象在自动类型转换时,得到想要的字符串形式。

toString()应用 判断数据类型
Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型。
上述的代码demo中 声明了一个对象 obj99 还有印象嘛? 这个obj99.toString()打印出来的 [object,Object] 其中第二个Object表示该值的构造函数。这是一个十分有用的判断数据类型的方法。由于实例对象可能会自定义toString方法,覆盖掉Object.prototype.toString方法,所以为了得到类型字符串,最好直接使用Object.prototype.toString方法。通过函数的call方法,可以在任意值上调用这个方法,帮助我们判断这个值的类型。
Object.prototype.toString.call(value)
上面代码表示对value这个值调用Object.prototype.toString方法,当value的数据类型不一样时 返回结果也是不一样的


利用这个特性,可以写出一个比typeof运算符更准确的类型判断函数。

属性描述对象
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
下面是一个例子 :

value 是该属性得属性值,默认是undefined。
writable 是一个布尔值,表示属性值(value)是否可改变(即是否可写),默认 true
enumerable 是一个布尔值,表示该属性是否可遍历,默认是true 如果设为false,会使得某些操作(比如for...in循环、Object.keys())跳过该属性。
configurable 是一个布尔值,表示可配置性,默认为true。如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外)。也就是说,configurable属性控制了属性描述对象的可写性。
get 是一个函数,表示该属性的取值函数(getter),默认为undefined。
set 是一个函数,表示该属性的存值函数(setter),默认为undefined。
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()方法可以获取属性描述对象。它的第一个参数是目标对象,第二个参数是一个字符串,对应目标对象的某个属性名。

注意,Object.getOwnPropertyDescriptor()方法只能用于对象自身的属性,不能用于继承的属性!
Object.defineProperty(),Object.defineProperties()
Object.defineProperty(),Object.defineProperties() 方法允许通过属性描述对象,定义或修改一个属性或多个属性,然后返回修改后的对象,它的用法如下。
Object.defineProperty(object,propertyName,attributesObject)
参数 object 属性所属对象 , propertyName 字符串,表示属性名,attributesObject 属性描述对象

上面代码中,Object.defineProperty()方法定义了obj43.p属性。属性描述对象的writable属性为true,所以ob43.p属性可写,p值被改写为232。注意,这里的Object.defineProperty方法的第一个参数是{}(一个新建的空对象),p属性直接定义在这个空对象上面,然后返回这个对象,这是Object.defineProperty()的常见用法。
Object.defineProperties(object,attributesObjects)
可以一次性定义或修改多个属性,举个例子:

上面代码中,Object.defineProperties()同时定义了obj对象的三个属性。其中,p3属性定义了取值函数get,即每次读取该属性,都会调用这个取值函数。
注意,一旦定义了取值函数get(或存值函数set),就不能将writable属性设为true,或者同时定义value属性,否则会报错。
Object.defineProperty()和Object.defineProperties()参数里面的属性描述对象,writable、configurable、enumerable这三个属性的默认值都为false。
网友评论