对象 进阶

JavaScript对象

特征
1.JavaScript对象每个属性都是一个名/值对。
2.属性名是字符串,因此可以把对象看成是从字符串到值的映射。
3.对象除了可以保持自有的属性,还可以从一个称为原型的对象继承属性。原型式继承(prototypal inheritance)是JavaScript的核心特征。
4.对象是动态的,可以增加或删除属性。
5.除了字符串、数值、true、false、null和undefined,其他值都是对象。
6.对象最常见的用法是对其属性进行创建、设置、查找、删除、检测和枚举等操作。
每个属性还有一些与之相关的值,称为“属性特征(property abttribute)”。
可写(writable attribute),表明是否可以设置属性的值。
可枚举(enumerable attribute),表明是否可以通过for/in结构返回该属性。
可配置(configurable attribute),表明是否可以删除或修改该属性。
7.每个对象都具有三个相关的对象特性:原型、类、扩展标记

特征
对象的分类:内置对象、宿主对象、自定义对象
属性的分类:自有属性、继承属性

创建对象方法

1.对象字面量
在这里插入图片描述
对象字面量是一个表达式,每次运算都会创建一个新的对象,其中的属性值也会重新计算。

2.通过new创建对象

new Object()

3.原型
3.1 每一个JavaScript对象(null除外)都和另一个对象相关联。“另一个对象”就是原型对象。每一个对象都从原型继承属性.

3.2 所有通过对象字面量创建的对象都具有同一个原型对象。通过Object.prototype获得原型对象的引用。object本质为构造函数,构造函数的prototype为当前对象的原型对象
在这里插入图片描述

3.3 通过new和构造函数创建的对象的原型就是构造函数的prototype属性引用的对象。如:new Array()对象的原型就是Array.prototype。

3.4 Object.prototype没有原型,它不继承任何属性,它是顶级对象。

3.5 所有内置构造函数都具有一个继承自Object.prototype的原型。
如:Array.prototype的属性继承自Object.prototype。
通过层级的原型继承形成的链接,称为“原型链”(prototype chain)。

3.Object.create( )
object.create()创建一个新对象(新对象为空),括号中为原型对象。
对新增对象做属性的更改不会影响原型对象的属性值,会在当前对象中新增该属性。
在这里插入图片描述

访问属性

.
[ ];
例如:obj.a obj [“first-name”]
在这里插入图片描述
属性访问错误会报undefined
在这里插入图片描述
无法设置属性的情况:
1.属性是只读的;
2.属性是继承的只读属性
在这里插入图片描述

属性相关

1.继承

原型继承链
以下代码为以参数p为原型对象创建一个对象
在这里插入图片描述
理解原型链继承:
在这里插入图片描述
以上输出为[Object Object],6
属性赋值操作首先检查原型链,以此判断是否允许赋值操作。

2.删除属性

delete运算符可以删除对象的属性。

1.delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。

2.delete运算符只能删除自有属性,不能删除继承属性。(要删除继承属性必须从定义这个属性的原型对象上删除它,而且这会影响到所有继承自这个原型的对象。)

3.检测属性

判断某个属性是否存在于某个对象中,可以通过in运算符、**hasOwnPreperty()propertyIsEnumerable()**方法,甚至也可以仅通过属性查询。
在这里插入图片描述

4.枚举属性

1.for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),把属性名称赋值给循环变量。
在这里插入图片描述
利用for/in循环,可以对两个对象进行各种形式的合并。

2.Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。
3.Object.getOwnPropertyNames(),它和Ojbect.keys()类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。

5.存取器属性getter和setter

由getter和setter定义的属性称做“存取器属性”(accessor property),它的特征不具有value和可写性,包括读取(get),写入(set),可枚举性和可配置性。

当程序查询存取器属性的值时,JavaScript调用getter方法(无参数);
当程序设置一个存取器属性的值时,JavaScript调用setter方法,将赋值表达式右侧的值当做参数传入setter。

例如:
在这里插入图片描述
查询round时会调用getter方法,设置round时会调用setter方法
当以circle为原型创建新对象时,对新对象进行查询和设置属性操作时会去原型对象circle中找getter和setter方法。

属性的特性

属性包含4个特性:值(value)、可写(writable)、可枚举(enumerable)、可配置(configurable)。

通过一个名为“属性描述符”(property descriptor)的对象实现属性特性的查询和设置操作,
1.Object.getOwnPropertyDescriptor()可以获取某个对象特定属性的属性描述符

参数为对象名和属性名
在这里插入图片描述
2.Object.definePeoperty(),设置属性的特性,或者想让新建属性具有某种特性。Object.defineProperties()同时修改和设置多个属性。
参数为要修改的对象、属性、属性描述符对象
在这里插入图片描述

原型查询

Object.getPrototypeOf(), 可以查询它的原型,参数为对象
isPrototypeOf(),检测一个对象是否是另一个对象的原型(或处于原型链中)

Object 构造函数的方法

Object.assign()
通过复制一个或多个对象来创建一个新的对象。

Object.create()
使用指定的原型对象和属性创建一个新对象。

Object.defineProperty()
给对象添加一个属性并指定该属性的配置。

Object.defineProperties()
给对象添加多个属性并分别指定它们的配置。

Object.entries()
返回给定对象自身可枚举属性的 [key, value] 数组。

Object.freeze()
冻结对象:其他代码不能删除或更改任何属性。

Object.getOwnPropertyDescriptor()
返回对象指定的属性配置。

Object.getOwnPropertyNames()
返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。

Object.getOwnPropertySymbols()
返回一个数组,它包含了指定对象自身所有的符号属性。

Object.getPrototypeOf()
返回指定对象的原型对象。

Object.is()
比较两个值是否相同。所有 NaN 值都相等(这与=不同)。

Object.isExtensible()
判断对象是否可扩展。

Object.isFrozen()
判断对象是否已经冻结。

Object.isSealed()
判断对象是否已经密封。

Object.keys()
返回一个包含所有给定对象自身可枚举属性名称的数组。

Object.setPrototypeOf()
设置对象的原型(即内部 [[Prototype]] 属性)。

Object.values()
返回给定对象自身可枚举值的数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值