js对象的特征
1、属性的分类:自有属性(own property)、继承属性(inherited property);
【注】一个名值对用‘,’来分隔;
2、原型:每一个js对象(null除外:空引用)都和另一个对象相关联,另一个对象就是原型对象,每一个对象都从原型继承属性;
【注】:
(1)可以通过对象.constructor来得到对象的构造函数的类型;
(2)字面量创建的对象相当于new Object()创建出来的;
3、原型链(prototype chain):所有内置构造函数都具有一个继承自Object.prototype的原型,通过层级的原型继承形成的链接;
4、Object.create():创建的是空对象,没有自己的属性;
(1)当前对象的属性赋值不会修改原型对象的属性值,而是添加到自己对象里面作为新的属性;
(2)此时创建的对象是顶层原型对象,连toString()都没有;
5、属性相关:
(1)继承:属性赋值操作首先检查原型链,以此判断是否允许赋值操作;
(2)属性访问错误:查询一个不存在的属性并不会报错,而是返回undefined,但是查询的属性的对象不存在,就会报错;
(3)删除属性:delete删除对象的属性,它的操作数是一个属性访问表达式,但它只是断开属性和宿主对象的联系,而不是真正的删除该属性,而不会去操作属性中的属性;
【注】继承的属性以及全局下的变量和函数delete是不能删除的,因为它们覆盖的面太大了;
(4)检测属性:判断某个属性是否存在于某个对象中,可以通过in(会查询到继承来的属性)、hasOwnProperty()和propertyIsEnumerable()方法,甚至也可以仅通过属性查询;
(5)枚举属性:
—— for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有和继承属性),把属性名称赋值给循环变量;
—— Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成;
—— Object.getOwnPropertyNames(),它和Object.keys()类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性;
(6)getter和setter:存取器属性也是可以继承的;
6、对象特性:
(1)原型属性:是在实例对象创建之初就设置好的;查询对象的原型
(2)可扩展性:表示是否可以给对象添加新属性;
—— 所有内置对象和自定义对象都是显式可扩展的;
—— 宿主对象的可扩展性是由JavaScript引擎定义的。
7、序列化对象:对象序列化(serialization)是指将对象的状态转换为字符串,也可将字符串还原为对象;