js对象

属性类型

1.数据属性

它包含的是一个数据值的位置,在这可以对数据值进行读写。

Configurable:表示能否通过delete删除属性重新定义属性,能否修改属性特性,,默认为true

Enumerable:能否通过for-in循环返回属性,默认为true

Writable:能否修改属性的值,默认为true

Value:包含这个属性的数据值

修改属性的默认特性要用到一个方法:Object.defineProperty()方法,这个方法有三个参数:属性所在的对象,属性名,一个描述符对象。

var person = {};

Object.defineProperty(person, "name", {
    value: 'Nicy'
})
person.name = 'Lee';  
console.log(person.name)    // 'Nicy'

Object.defineProperty(person, "name", {
    writable: true
})
person.name = 'Lee';
console.log(person.name)    // 'Lee'

Object.defineProperty直接创建的属性如果不指定,Configurable,Enumerable,writable默认为false

把Configurable设置为false后,表示不能从对象中删除属性,一旦把Configurable定义为false后,就不能再把它变回true了

2.访问器属性

这个属性不包含数据值,包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的。

Configurable:表示能否通过delete删除属性重新定义属性,能否修改属性特性,,默认为true

Enumerable:能否通过for-in循环返回属性,默认为true

get:在读取属性时调用的函数,默认值为undefined

set:再写入属性时调用的函数,默认值为undefined

访问器属性不能直接定义,必须用Object.defineProperty()来定义,其configurable和enumerable默认为false。

var person = {
    name: 'Nicy',
    _age: 21,
    year: 1997,
    _year: 1997,
    sayName: function() {
        console.log(this.name);
    }
}
Object.defineProperty(person, "age", {
    get: function() {
        return this._age;
    },
    set: function(value) {
        this._age = value;
    }
})

在访问器属性的get和set中,不可以使用this访问属性本身,否则会无限递归而导致内存泄漏

定义多个属性

Object.defineProperties()

var person = {};
Object.defineProperties(person, {
  name: {
    value: 'Nicy',
    writable: true
  },
  _age: {
    value: 21,
    enumerable: true,
    writable: true,
    configurable: true
  },
   age: {
    get: function() {
    return this._age;
    },
    set: function(value) {
    this._age = value;
    }
  }
});

读取属性特性

Object.getOwnPropertyDescriptor接收两个参数:属性所在对象和要读取其描述符的属性名称

var obj = { p: 'a' };
Object.getOwnPropertyDescriptor(obj, 'p')
// Object { value: "a",
// writable: true,
// enumerable: true,
// configurable: true
// }

理解原型对象

创建一个新函数,该函数自动获得一个prototype属性,这个属性指向函数的原型对象,默认情况下,原型对象自动获得一个constructor属性,这个属性指向该函数的构造函数

isPrototypeOf()

作用:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中

 function Animal(){
    this.species = "动物";
 };
  var eh = new Animal();
  Animal.prototype.isPrototypeOf(eh)//=>true

Object.getPrototypeOf()

alert(Object.getPrototypeOf(person1) == Person.prototype)  //true

hasOwnProperty()

检测一个属性是存在于实例中,还是存在于原型中,存在于原型中返回false,存在于实例中,返回true

Object.keys()

如果你想要获得所有实例属性,并仅需可枚举的,可以使用这个方法  其实和for in遍历出来的是一样的,返回一个属性名数组

Object.getOwnPropertyName()

如果你想要获得所有实例属性,无论他是否可枚举,可以使用这个方法,返回一个属性名数组

posted @ 2018-10-20 15:42  loseway  阅读(103)  评论(0)    收藏  举报