javascript对象
2015-08-23 17:42
656 查看
定义一个对象
可以使用对象直接量var o = {name: 'hello'};
键名加不加引号都可以,但是如果键名不是合法标识符,就必须加引号。
对象的属性之间用逗号分隔,ECMAScript 5规定最后一个属性后面可以加逗号(trailing comma),也可以不加。但是,ECMAScript 3不允许添加逗号,所以如果要兼容老式浏览器(比如IE 8),那就不能加这个逗号。
JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象。Object本身也是一个构造函数,可以直接通过它来生成新对象。
var o = new Object(); // {}
Object作为构造函数使用时,可以接受一个参数。如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象。
也可以使用
Object.create()
var o3 = Object.create(null);
读写属性
如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。但是,数字键可以不加引号,因为会被当作字符串处理。方括号运算符内部可以使用表达式,点号不行
o['hello' + ' world'] o[3+3]
使用in运算符检查属性是否声明
查看一个对象本身的所有属性,可以使用Object.keys方法
var o = { key1: 1, key2: 2 }; Object.keys(o); // ["key1", "key2"]
删除一个属性,需要使用delete命令
一旦使用delete命令删除某个属性,再读取该属性就会返回undefined,而且Object.keys方法返回的该对象的所有属性中,也将不再包括该属性
如果删除一个不存在的属性,delete不报错,而且返回true
只有一种情况,delete命令会返回false,那就是该属性存在,且不得删除
var o = Object.defineProperty({}, "p", { value: 123, configurable: false }); o.p // 123 delete o.p // false
可以用in运算符判断,一个全局变量是否存在
// 假设变量x未定义 // 写法一:报错 if (x){ return 1; } // 写法二:不正确 if (window.x){ return 1; } // 写法三:正确 if ('x' in window) { return 1; }
上面三种写法之中,如果x不存在,第一种写法会报错;如果x的值对应布尔值false(比如x等于空字符串),第二种写法无法得到正确结果;只有第三种写法,才能正确判断变量x是否存在。
in对继承的属性也返回true
Object对象的方法
Object
Object本身当作工具方法使用时,可以将任意值转为对象。其中,原始类型的值转为对应的包装对象Object.keys(),Object.getOwnPropertyNames()
Object.keys方法和Object.getOwnPropertyNames方法很相似,一般用来遍历对象的属性。它们的参数都是一个对象,都返回一个数组,该数组的成员都是对象自身的(而不是继承的)所有属性名。它们的区别在于,Object.keys方法只返回可枚举的属性(关于可枚举性的详细解释见后文),Object.getOwnPropertyNames方法还返回不可枚举的属性名。Object.observe()
Object.observe方法用于观察对象属性的变化var o = {}; Object.observe(o, function(changes) { changes.forEach(function(change) { console.log(change.type, change.name, change.oldValue); }); }); o.foo = 1; // add, 'foo', undefined o.foo = 2; // update, 'foo', 1 delete o.foo; // delete, 'foo', 2
其他
(1)对象属性模型的相关方法Object.getOwnPropertyDescriptor():获取某个属性的attributes对象。 Object.defineProperty():通过attributes对象,定义某个属性。 Object.defineProperties():通过attributes对象,定义多个属性。 Object.getOwnPropertyNames():返回直接定义在某个对象上面的全部属性的名称。
(2)控制对象状态的方法
Object.preventExtensions():防止对象扩展。 Object.isExtensible():判断对象是否可扩展。 Object.seal():禁止对象配置。 Object.isSealed():判断一个对象是否可配置。 Object.freeze():冻结一个对象。 Object.isFrozen():判断一个对象是否被冻结。
(3)原型链相关方法
Object.create():生成一个新对象,并该对象的原型。 Object.getPrototypeOf():获取对象的Prototype对象。
Object实例对象的方法
除了Object对象本身的方法,还有不少方法是部署在Object.prototype对象上的,所有Object的实例对象都继承了这些方法。Object实例对象的方法,主要有以下六个
valueOf():返回当前对象对应的值。 toString():返回当前对象对应的字符串形式。 toLocalString():返回当前对象对应的本地字符串形式。 hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。 isPrototypeOf():判断当前对象是否为另一个对象的原型。 propertyIsEnumerable():判断某个属性是否可枚举。
对象的属性模型
属性的attributes对象,Object.getOwnPropertyDescriptor()
在JavaScript内部,每个属性都有一个对应的attributes对象,保存该属性的一些元信息。使用Object.getOwnPropertyDescriptor方法,可以读取attributes对象。var o = { p: 'a' }; Object.getOwnPropertyDescriptor(o, 'p') // Object { value: "a", // writable: true, // enumerable: true, // configurable: true // }
attributes对象包含如下元信息
value:表示该属性的值,默认为undefined。 writable:表示该属性的值(value)是否可以改变,默认为true。 enumerable: 表示该属性是否可枚举,默认为true,也就是该属性会出现在for...in和Object.keys()等操作中。 configurable:表示“可配置性”,默认为true。如果设为false,表示无法删除该属性,也不得改变attributes对象(value属性除外),也就是configurable属性控制了attributes对象的可写性。 get:表示该属性的取值函数(getter),默认为undefined。 set:表示该属性的存值函数(setter),默认为undefined。
Object.defineProperty(),Object.defineProperties()
Object.defineProperty方法允许通过定义attributes对象,来定义或修改一个属性,然后返回修改后的对象。它的格式如下:Object.defineProperty(object, propertyName, attributesObject)
如
var o = Object.defineProperty({}, "p", { value: 123, writable: false, enumerable: true, configurable: false });
如果一次性定义或修改多个属性,可以使用Object.defineProperties方法
var o = Object.defineProperties({}, { p1: { value: 123, enumerable: true }, p2: { value: "abc", enumerable: true }, p3: { get: function() { return this.p1+this.p2 }, enumerable:true, configurable:true } });
上面代码中的p3属性,定义了取值函数get。这时需要注意的是,一旦定义了取值函数get(或存值函数set),就不能将writable设为true,或者同时定义value属性,否则会报错。
控制对象状态
JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。Object.preventExtensions
Object.preventExtensions方法可以使得一个对象无法再添加新的属性var o = new Object(); Object.preventExtensions(o); Object.defineProperty(o, "p", { value: "hello" }); // TypeError: Cannot define property:p, object is not extensible. o.p = 1; o.p // undefined
可以用delete命令删除它的现有属性
Object.isExtensible
Object.isExtensible方法用于检查一个对象是否使用了preventExtensions方法。也就是说,该方法可以用来检查是否可以为一个对象添加属性var o = new Object(); Object.isExtensible(o) // true Object.preventExtensions(o); Object.isExtensible(o) // false
Object.seal
Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性var o = { p:"hello" }; Object.seal(o); delete o.p; o.p // "hello" o.x = 'world'; o.x // undefined
Object.seal还把现有属性的attributes对象的configurable属性设为false,使得attributes对象不再能改变
可写性(writable)有点特别。如果writable为false,使用Object.seal方法以后,将无法将其变成true;但是,如果writable为true,依然可以将其变成false
至于属性对象的value是否可改变,是由writable决定的
Object.isSealed
Object.isSealed方法用于检查一个对象是否使用了Object.seal方法Object.freeze
Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量var o = {p:"hello"}; Object.freeze(o); o.p = "world"; o.p // hello o.t = "hello"; o.t // undefined
Object.isFrozen
Object.isFrozen方法用于检查一个对象是否使用了Object.freeze()方法参考
http://javascript.ruanyifeng.com/grammar/object.htmlhttp://javascript.ruanyifeng.com/stdlib/object.html
相关文章推荐
- JSP 笔记
- js算法:分治法-归并排序
- JavaScript——关于画布元素canvas的使用
- JSON详解
- BackboneJS入门学习[01]---预热
- JS的HTML DOM disabled 属性
- javascript 如何访问 action或者controller 传给 jsp 页面的值
- 【js】JSON.stringify 语法实例讲解
- jsp基础语法
- JavaScript添加事件
- [LeetCode][JavaScript]Course Schedule II
- JSON.parse()和JSON.stringify()
- javascript活动
- [LeetCode][JavaScript]Course Schedule
- JS的一些笔记
- js笔试题
- 【JavaScript基础知识】——数据类型与typeof操作符
- JavaScript高级
- JavaScript表单验证
- 排序图解:js排序算法实现