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()
如果你想要获得所有实例属性,无论他是否可枚举,可以使用这个方法,返回一个属性名数组

浙公网安备 33010602011771号