对象的属性及方法

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:新的值必须大于当前值
Tags: