对象的属性及方法
1、创建对象
(1)let obj1 = new Object( )
(2)let obj2 = { }
2、设置属性或方法
let obj = { }
(1)obj.sex = ‘man’
(2)obj[‘age’] = 18
二者区别:“[ ]”设置属性可以传变量,“.”设置属性不能使用变量
3、获取对象的属性
let obj = { “sex”: “man”, “age”: 18}
(1)obj.sex // man
(2)obj[‘age’] // 18
4、对象属性的删除
var obj = {name:’abc’,age:18}
delete obj.ame
delete obj[“age”]
console.log(obj) // { }
5、检测属性,判断对象中是否存在该属性
key in obj // 既可以检测对象自身的属性,也可以检测对象原型中的属性
obj.hasOwnProperty( key ) // 只能检测对象自身的属性,无法检测继承到的属性
var obj = {name:’abc’,age:18}
console.log(’ name’ in obj) // true
console.log(obj.hasOwnProperty(’ age’)) //true
6、遍历对象
var arr = [’a’, ’b’, ’c’];
var obj = {name:’abc’,age:18}
for(var v in abj){
console.log(v) // key 循环对象的时候v表示属性
}
for(var v in arr){
console.log(v) // index 循环数组的时候v表示索引
}
7、对象序列化
JSON.parse() // json字符串转对象
JSON.stringify() // 对象转json字符串
var obj = {“name”: “abc”, “age”:18}
JSON.stringify( obj ) // “{“name”: “abc”, “age”: 18}”
JSON.parse(“{“name”: “abc”, “age”: 18}”) // {“name”: “abc”, “age”: 18}
8、instanceof
作用:用来验证一个对象是否为指定的构造函数的实例
[1,2,3,4] instanceof Array // true
1 instanceof Number // false
function fn(){ console.log(1) }
fn instanceof Function // true
9、遍历对象的属性
(1)Object.keys( )
作用:该方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。
var obj = {p1:123,p2:456}
Object.keys( obj ) // [‘p1’, ‘p2’]
(2)Object.getOwnPropertyNames( )
作用:该方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。
var obj = {p1:123,p2:456}
Object.getOwnPropertyNames( obj ) // [‘p1’, ‘p2’]
二则区别:对于一般的对象来说,Object.keys()和Object.getOwnPropertyNames()返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys方法只返回可枚举的属性,Object.getOwnPropertyNames方法还可以返回不可枚举的属性名。
var arr = [1,2,3,4,5]
Object.keys( arr )
[“0”, “1”, “2”, “3”, “4”]
Object.getOwnPropertyNames(arr)
[“0”, “1”, “2”, “3”, “4”, “length”]
10、Object.prototype.toString.call( )
作用:可以用来判断数据类型 ,比typeof运算符更准确的类型判断函数
Object.prototype.toString.call(2) // “[object Number]”
Object.prototype.toString.call(‘ ‘) // “[object String]”
Object.prototype.toString.call(true) // “[object Boolean]”
Object.prototype.toString.call(undefined) // “[object Undefined]”
Object.prototype.toString.call(null) // “[object Null]”
Object.prototype.toString.call(Math) // “[object Math]”
Object.prototype.toString.call({}) // “[object Object]”
Object.prototype.toString.call([]) // “[object Array]”
11、属性描述对象
Object.getOwnPropertyDescriptor()方法可以获取属性描述对象。它的第一个参数是目标对象,第二个参数是一个字符串,对应目标对象的某个属性名。
定义:
{
value: 123,
writable: false,
enumerable: true,
configurable: false,
get:undefined,
set:undefined
}
value是该属性的属性值,默认为undefined。
writable是一个布尔值,表示属性值(value)是否可改变(即是否可写),默认为true。
enumerable是一个布尔值,表示该属性是否可遍历,默认为true。如果设为false,会使得某些操作(比如for…in循环、Object.keys())跳过该属性。
configurable是一个布尔值,表示可配置性,默认为true。如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外)。也就是说,configurable属性控制了属性描述对象的可写性。
get是一个函数,表示该属性的取值函数(getter),默认为undefined
set是一个函数,表示该属性的存值函数(setter),默认为undefined
示例:
var obj1 = {p:111}
Object.getOwnPropertyDescriptor(obj1,’p’)
{
value: 111
writable: true
enumerable: true
configurable: true
}
注意,Object.getOwnPropertyDescriptor()方法只能用于对象自身的属性,不能用于继承的属性。
12、Object.defineProperty( )、Object.defineProperties( )
(1)Object.defineProperty( )
作用:该方法允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象
var obj = Object.defineProperty({ }, ‘p’, {
value: 123,
writable: false,
enumerable: true,
configurable: false
})
obj.p // 123
obj.p = 456
obj.p // 123
(2)Object.defineProperties( )
var obj = Object.defineProperty({ }, {
’p1′: { value: 123, enumerable: true },
’p2′: { value: ‘abc’, enumerable: true },
’p3′: { get:function(){ return this.p1 + this.p2} , enumerable: true}
})
obj.p1 // 123
obj.p2 // ‘abc’
obj.p3 // ‘123abc’
注意,一旦定义了取值函数get(或存值函数set),就不能将writable属性设为true,或者同时定义value属性,否则会报错。
Object.defineProperty()和Object.defineProperties()参数里面的属性描述对象,writable、configurable、enumerable这三个属性的默认值都为false。
13、obj.propertyIsEnumerable( )
作用:该方法返回一个布尔值,用来判断某个属性是否可遍历。注意,这个方法只能用于判断对象自身的属性,对于继承的属性一律返回false。
14、存取器
var obj = Object.defineProperty({ }, ‘p’, {
get : function( ){
return ‘getter’
},
set : function(val){
console.log(‘setter:’ + val)
}
})
obj.p // ‘getter’
obj.p =123 //’setter: 123′
另一种写法:
var obj1 = {
get p(){ return 111},
set p(val){console.log(‘setter:’ + val)}
}
obj1.p // 111
obj1.p =123 // ‘setter: 123’
应用:
var obj = {
v: 5,
get p(){ return this.v},
set p(val){
if(val >= this.v) {
this .v = val
}else{
throw new Error(‘新的值必须大于当前值’)
}
}
}
obj.p // 5
obj.p = 10
obj.p // 10
obj.p = 5 // Uncaught Error:新的值必须大于当前值