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()
返回给定对象自身可枚举值的数组。