JS对象基本用法

204 阅读4分钟

对象是一组无需的属性组成,每个属性都会包含名字,值和特性,每个名字能映射到一个值,对象也被称为散列表或字典。
每个对象都有一个原型属性,通过原型(prototype)可以继承其他对象的属性和方法。所有内置对象都继承了Object对象中的属性和方法,并且还会根据自身特点做适当的自定义,例如Object中的3个基础方法:toString(),toLoaclString()和valueOf(),在数组和函数中会输出不同的结果。不过,想Navigatoe,Location等宿主环境中的宿主对象就不会继承Object。与基本类型不同,对象是可变的,当把一个对象赋给变量时,获得的不是对象副本,而是引用该对象的指针。

var obj1 = {name:"strick"},
    obj2 = obj1;
obj2.name = "pingwen";
console.log(obj1);
console.log(obj2);

创建

1.构造函数:使用运算符new和Object的构造函数能创建一个新的Object实例。当构造函数的参数为空或传入null.undefined时,将会创建一个空对象;当构造函数的参数是数字,布尔值或字符串时,将会创建一个包装对象(Number,Boolean或String),所有的对象都有一个指向构造函数的属性。
构造函数创建对象的方法

Object();
new Object();
new Object(null);
new Object(undefined);
Object(1);
new Object(1)

2.字面量:对象字面量是创建对象的一种简写形式,只需将属性或方法放入一对花括号中,再用逗号隔开,就完成了对象的创建。使用对象字面量创建对象时,不会调用Object的构造函数,并且每次都会创建一个新的对象,

var obj1 ={};
var obj2 = {name:"strick",age:28};

声明

无序的数据集合和键值对的集合

属性名:每个 key 都是对象的属性名(property)

属性值:每个 value 都是对象的属性值。

下面是两种声明对象的代码书写格式:

let obj = { 'property': 'guokai', ' value': 20 }; let obj = new Object({'property': 'guokai',}); 运行:Object.keys(obj)可以得到obj的所有key. 注意:键名是字符串,不是标识符

属性

属性按照定义时所处的位置可以分为自有属性和继承属性,自由属性定义在对象中,而继承属性定义在对象原型链中,根据属性的特性,又可分为数据属性和访问器属性。

1.读取:属性名可以用标识符或字符串字面量表示,属性值可以是任意类型的值或表达式。有一点要注意的是属性名都是字符串类型的。如果不是字符串,那么会被自动转换成字符串。可以通过两种方式读取属性,第一种是用点号(.),第二种是用方括号[]

2.写入:与读取属性的写法类似,通过点号或者方括号给属性赋值,但需要将它们放在赋值表达式的左侧。

对象不能给继承的属性赋值,只能覆盖,并且也不能给只读属性赋值。

3.数据属性:在ES5中,属性能够设置自身的特性。数据属性有4个描述其行为的特性,属性值也算一个特性

特性 描述 默认值
可写(writable) 属性能否被赋值 false
可枚举(enumerable) 属性能否出现在对象的枚举属性类表中,当为true时,才能被for-in循环遍历到。注意,当for-in循环既能遍历自由属性,也能遍历继承属性 false
可配置(configurable) 属性能否被删除,以及能否修改属性的特性 false
值(value) 属性的值,可以是任意类型的值
undefined

4.访问器属性:访问器属性有4个属性,不过没有writable和value,这两个特性被替换成了两个方法:get()和set().当读取属性的值时,调用无参数的方法get();当写入属性的值时,调用方法set(),赋值表达式右侧的值就是此方法的参数。这两个方法相当于属性的包装器,能在读取或写入属性时添加更多额外的行为,提升了属性控制的灵活性。

5.检测:JavaScript提供了3种方式,可判断某个属性是否存在于指定对象中。

检测方式 描述
in运算符 在对象的自由属性或继承属性中包含要匹配的属性,就返回true,负责返回false
使用Object的hasOwnProperty() 在对象的自由属性中要包含匹配的属性时,就返回true,否则返回false
使用object的propertyIsEnumerable() 在对象可枚举的自有属性中包含要匹配 的属性时,就返回true,否则返回false

6.删除:delete运算符可以删除对象的属性,但只能删除自有属性,不能删除继承属性,并且只是删除属性与值之间的映射关系。如果属性值是对象,那么属性值中的属性并不会被删除。

delete obj.xxx或delete obj['xxx']

不含属性名

'xxx' in obj === false

含有属性名,但值为undefined

'xxx' in  obj&&obj.xxx === undefined

\color{#FF3030}{obj.name等价于obj['name]';obj.name不等价于obj[name].这里的name是字符串,而不是变量}