Object 原型方法
静态方法
对象操作
Object.create()
语法:
Object.create(proto, [propertiesObject])
作用:
创建一个新对象,且新对象的原型为 proto
参数:
- proto:新创建对象的原型对象;如果 proto 参数不是 null 或非原始包装对象,则抛出
TypeError
异常 - propertiesObject:可选参数。如果该参数不为 undefined,则该对象的自有可枚举属性将为新创建的对象添加指定的属性值和对象的属性描述符 -> 例子
返回值:
一个新对象,且该对象的原型指向 proto
原对象是否改变:
否。(因为这是生成对象的方法,并没有原对象)
Object.assign()
语法:
Object.assign(target, source)
作用:
用于将所有可枚举属性的值从一个或多个源对象分配到目标对象
参数:
- target:目标对象
- source:源对象
返回值:
目标对象
目标对象是否改变:
是
补充:
- 如果目标对象和源对象有相同的键,则源对象的值会覆盖目标对象的值。后面的源对象的值将类似地覆盖前面源对象的值
- 此方法为浅拷贝,即 基本类型的值会拷贝,引用类型的值只是拷贝引用地址
Object.entries()
语法:
Ojbect.entries(obj)
作用
返回一个给定对象自身可枚举属性
的键值对数组
参数
obj:要返回其可枚举属性的键值对的对象
返回值
传入参数的可枚举属性的键值对数组
原对象是否改变:
否
例子
1 | const obj = { |
Object.fromEntries()
语法:
Object.fromEntries(entries)
作用:
把键值对列表转换为一个对象(与 Object.entries()
是互逆的操作)
参数:
entries:类似 Array
、Map
或者其他实现了可迭代协议的可迭代对象
返回值:
由迭代对象条目提供对应属性的新对象
例子
1 | const map = new Map([ ['foo', 'bar'], ['baz', 42] ]); |
Object.is()
语法:
Object.is(value1, value2)
作用:
判断两个值是否为同一个值
描述:Object.is()
在进行相等判断时,不会强制转换两边的值
如果满足以下任意条件,则两个值相等:
- 都是 undefined
- 都是 null
- 都是 true 或 false
- 都是相同长度、相同字符、按相同顺序排列的字符串
- 都是相同对象(即都是同一个对象的值引用)
- 都是数字,且:
- 都是 +0
- 都是 -0
- 都是 NaN
- 都是同一个值,非零且都不是 NaN
参数:
- value1:被比较的第一个值
- value2:被比较的第二个值
返回值:
true 或 false
原对象是否改变:
否
例子:
1 | Object.is('foo', 'foo'); // true |
属性相关
Object.defineProperty()
语法:
Ojbect.defineProperty(obj, prop, descriptor)
作用:
在一个对象上定义新的属性或修改现有属性
参数
- obj:要定义属性的对象
- prop:要定义或修改的属性的名称
- descriptor:要定义或修改属性的描述符,同
definedProperties
的描述符具有以下键:
返回值:
被传递给函数的对象
原对象是否改变:
是(只是改变的对应的键的属性或值)
例子:
1 | const obj = {} |
Object.defineProperties()
语法:
Ojbect.defineProperties(obj, props)
作用:
在一个对象上定义新的属性或修改现有属性
参数
- obj:定义或修改属性的对象
- props:要定义其可枚举属性或修改的属性描述符的对象
- 描述符具有以下键:
configurable
- 说明:该属性描述符所在键的其他属性是否可以被修改
- 默认值:false
enumerable
- 说明:是否可枚举
- 默认值:false
value
- 说明:与属性关联的值
- 默认值:undefined
writable
- 说明:该属性对应的键的值能否被修改
- 默认值:false
get
- 说明:getter函数,函数返回值将被用作属性的值
- 默认值:undefined
set
- 说明:setter函数,函数仅接受参数赋值给该属性的新值
- 默认值:undefined
- 描述符具有以下键:
返回值:
传递给函数的对象
原对象是否改变:
是(只是改变的对应的键的属性或值)
例子:
1 | const obj = {} |
Object.getOwnPropertyDescriptor()
语法:
Object.getOwnPropertyDescriptor(obj, key)
作用:
返回指定对象上的一个自有属性对应的属性描述符(自有属性,即直接赋予该对象的属性,不需要从原型链上进行查找的属性)
参数:
- obj:要查找的目标对象
- key:属性名称
返回值:
如果指定的属性名称存在于对象上,则返回其属性描述符,否则返回 undefined
原对象是否改变:
否
例子:
1 | const obj = {a:1,b:2} |
Object.getOwnPropertyDescriptors()
语法:
Object.getOwnPropertyDescriptors(obj)
作用:
获取一个对象的所有自身属性的属性描述符(自有属性,即直接赋予该对象的属性,不需要从原型链上进行查找的属性)
参数:
obj:要查找的目标对象
返回值:
一个对象,包含了目标对象的所有自身属性的描述符;如果没有任何自身属性,返回空对象
原对象是否改变:
否
例子:
1 | const obj = {a: 1} |
Object.getOwnPropertyNames()
语法:
Object.getOwnPropertyNames(obj)
作用:
返回一个由 指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性) 组成的数组
参数:
obj:一个对象
返回值:
在给定对象上找到的自身属性对应的字符串数组
原对象是否改变:
否
例子:
1 | const arr = ['a','b','c'] |
Object.getOwnPropertySymbols()
语法:
Object.getOwnPropertySymbols(obj)
作用:
返回一个由给定对象自身的所有 Symbol 属性组成的数组
参数:
obj:一个对象
返回值:
在给定对象上找到的所有 Symbol 属性组成的数组
原对象是否改变:
否
例子:
1 | const objPro = { a: 1, b: 2 } |
对象冻结、密封、扩展
Object.freeze()
语法:
Object.freeze(obj)
作用:
冻结一个对象(浅冻结),对象被冻结后,不能进行增删改操作(包括对象已有属性的可枚举性、可配置性),对象的原型也不能被修改
参数:
obj:要冻结的对象
返回值:
被冻结的对象
原对象是否改变:
是
例子
1 | const obj = {a:1,b:2,c:{d:3},e:[1,2,3]} |
Object.isFrozen()
语法:
Object.isFrozen(obj)
作用:
判断一个对象是否被冻结
参数:
obj:被检测的对象
返回值:
被检测对象是否被冻结的布尔值
原对象是否改变:
否
例子
1 | // 一个对象默认是可扩展的,所以它也是非冻结的 |
Object.seal()
语法:
Object.seal(obj)
作用:
封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要是原来是可写的就可以改变
参数:
obj:将要被密封的对象
返回值:
被密封的对象
原对象是否改变:
是
描述:
一个对象通常是可以扩展的。密封会让对象变得不能添加新属性,且已有属性会变得不可配置。属性不可配置的效果就是属性变得不可删除,以及数据属性不能被重新定义为访问器属性。不会影响从原型链上继承得属性
例子:
1 | const obj = { a: 1} |
Object.isSealed()
语法
Object.isSealed(obj)
作用:
判断一个对象是否被密封
参数:
obj:要被检查的对象
返回值:
表示给定对象是否被密封的 Boolean
原对象是否改变:
否
描述:
密封对象是指那些不可扩展
的,且所有自身属性都不可配置且因此不可删除
(但不一定是不可写) 的对象
例子:
1 | // 新建的对象默认不是密封的 |
Object.preventExtensions()
语法
Object.preventExtensions(obj)
作用:
让一个对象变的不可扩展,即不能再添加新的属性。一旦对象变为不可扩展对象,就再也不能使其可扩展
参数:
obj:要变的不可扩展的对象
返回值:
已经不可扩展的对象
原对象是否改变:
是。原对象已不可扩展,包括不能修改原型
例子:
1 | // 返回的是不可扩展的原对象 |
Object.isExtensible()
语法:
Object.isExtensible(obj)
作用:
判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)
参数:
obj:需要检测的对象
返回值:
表示给定对象是否可以扩展的一个布尔值
原对象是否改变:
否
例子:
1 | // 新对象默认是可扩展的 |
原型相关
Object.getPrototypeOf()
语法:
Object.getPrototypeOf(obj)
作用:
返回指定对象的原型
参数:
obj:一个对象
返回值:
给定对象的原型,如果没有继承属性,则返回 null
原对象是否改变:
否
例子:
1 | const proto = {} |
Object.setPrototypeOf()
语法:
Object.setPrototypeOf(obj, prototype)
作用:
设置一个指定的对象的原型(即内部 [[Prototype]] 属性]到另一个对象或 null
参数:
- obj:要设置原型的对象
- prototype:新原型(一个对象或 null)
返回值:
修改原型后的对象
原对象是否改变:
是(原型指向改变了)
描述:
如果对象的 [[Prototype]] 被修改成不可扩展,再去修改的话会抛出 TypeError
;如果参数 prototype 不是一个对象活着 null,则什么都不做
例子:
1 | const proto = { a: 1, b: 2 } |
对象遍历
Object.keys()
语法
Object.keys(obj)
作用:
返回一个由给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致
参数:
obj:要返回其枚举自身属性的对象
返回值:
一个表示给定对象的所有可枚举属性的字符串数组
原对象是否改变:
否
例子:
1 | const arr = ['a', 'b', 'c'] |
Object.values()
语法:
Object.values(obj)
作用:
返回给定对象自身的所有可枚举属性值
的数组,值的顺序与使用for..in
循环的顺序相同
参数: obj:一个对象
返回值:
包含提供对象的自身的所有可枚举属性值的数组
例子:
1 | var obj = { foo: 'bar', baz: 42 }; |
实例方法
Object.prototype.hasOwnProperty()
语法:
obj.hasOwnProperty(key)
作用:
判断对象自身属性中是否有指定的键,有,返回 true;没有,返回 false
参数:
- obj:检测的对象
- key:要检测的键
返回值:
true 或 false
原对象是否改变:
否
例子:
1 | const obj = { a: 1, b: 2 } |
Object.prototype.isPrototypeOf()
语法
prototypeObj.isPrototypeOf(object)
作用:
测试一个对象(prototypeObj)是否存在于另一个对象(object)的原型链上
参数:
obj:
prototypeObj
:要搜寻的对象object
:被搜寻的对象,即在该对象的原型链上搜寻
返回值:
表示调用对象是否在另一个对象的原型链上的布尔值
原对象是否改变:
否
描述:
isPrototypeOf()
在对象的原型链上搜寻instanceof
A instanceof B
,判断构造函数B的prototype是否存在于对象A的原型链上
一个是针对本身检查,一个是针对原型检查
例子:
1 | function Foo() { } |
Object.prototype.propertyIsEnumerable()
语法:
obj.propertyIsEnumerable(key)
作用:
返回一个布尔值,表示指定的属性是否可枚举
参数:
key:需要测试的属性名
返回值:
用来表示指定的属性名是否可枚举的布尔值
原对象是否改变:
否
例子:
1 | const obj = { a: 1 }, ary = [1] |
Object.prototype.toLocaleString()
语法:
obj.toLocaleString()
作用:
返回一个该对象的字符串表示。此方法被用于派生对象为了特定语言环境的目的而重载使用
参数: obj:一个对象
返回值:
表示对象的字符串
原对象是否改变:
否
描述:
Object 的 toLocaleString 方法返回调用 toString() 的结果。Number、Array、Date 原型上的方法会覆盖对象上提供的此方法
Object.prototype.toString()
语法:
obj.toString()
作用:
返回一个表示该对象的字符串
参数: obj:一个对象
返回值:
表示该对象的字符串
描述:
默认情况下,toString()
方法被每个对象继承。如果此方法在自定义对象中未被覆盖,toString()
返回[object type]
,其中type
是对象的类型
Object.prototype.valueOf()
语法:
obj.valueOf()
作用:
返回指定对象的原始值
参数: obj:一个对象
返回值:
该对象的原始值
描述:
默认情况下,valueOf
方法由Object
后面的每个对象继承。每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,将返回对象本身
强制数字类型转换和强制基本类型转换优先会调用该方法,而强制字符串转换会调用 toString(),并且 toString() 很可能返回字符串值,因此在这种情况下不会调用 valueOf()
Object.prototype.valueOf() 的基本实现被有意设计为无用的:返回一个对象;其返回值将永远不会被任何基本类型转换算法使用,许多内置对象重写此方法以返回适当的基本类型值。创建自定义对象时,可以重写 valueOf() 来调用自定义方法,以便将自定义对象转换为基本类型值
不同类型对象的 valueOf() 方法的返回值
对象 | 返回值 |
---|---|
Array | 返回数组对象本身 |
Boolean | 布尔值 |
Date | 存储的时间是从 1970年1月1日午夜 开始计的毫秒数 |
Function | 函数本身 |
Number | 数字值 |
Object | 对象本身。这里是默认情况 |
String | 字符串值 |
Maht 和 Error 对象没有 valueOf() 方法 |
例子:
1 | // Array:返回数组对象本身 |