/* 检测属性 检测属性可以通过三种方式 1.通过in运算符 2.通过hasOwnPerperty() 如果给定的属性是继承属性将返回false 3.通过propertyIsEnumerable():只有检测到的自有属性且这个属性的可枚举性为true时它才返回true,某些内置对象是不可枚举的,通常由JavaScript代码创建的对象的属性是可枚举的。 */ var o = { x: 1}; "x" in o.x; //true "y" in o.x; //false "toString" in o.x //true o继承toString 属性 o.hasOwnProperty("x"); //true o.hasOwnProperty("y"); //false o.hasOwnProperty("toString") //false:toString是继承来的属性 o.propertyisEnumerable("x"); //true o.propertyisEnumerable("y"); //false Object.prototype.propertyIsEnumerable("toString"); //false //除了使用in运算符之外,别一种更简便的方法是使用“!==”判断一个属性是否是undefined o.x !== undefined; //true o.y !== undefined; //false o.toString !== undefined; //true /* 枚举属性: for/in循环可以在循环中遍历对象中所有可枚举属性(自有属性和继承属性),属性名称赋值给循环变量。对象继承内置方法不可枚举,但在代码中给对象添加的属性都是可枚举的 */ /* 属性特性 数据属性的四个特性:值(value)、可写性(writable)、可枚举性(enumerable)、可配置性(configurable). 存取器属性的四个特性:取(get) 、 写入(set)、可枚举性和可配置性 为了实现属性的查询和设置操作,ECMAScript5中定义了一个名字为"属性描述符" 数据属性描述符:value writrable enumerable configurable 通过调用Object.getOwnPropertyDescription()(只能得到自有属性的描述符)可以获得某个对象特定属性的属性描述符: //返回 {value: 1, writrable:true, enumerable:true, configuration:true} Object.getOwnPropertyDescrition({x:1}, "x"); 对于继承属性和不存在的属性:返回undefined 要想设置属性的特性,歌者想让新建属性具有某种特性,则需要调用Object.definProperty(),传入要修改的对象、要创建或修改的属性的名称以及属性描述符对象; Object.definProperty(o, "x", {x:1, writable: true, enumerable: false, configurable: true}); 如果要同时修改或创建多个属性,则需要使用Object.defineproperties(),第一个参数是要修改的对象,第二个参数是一个映射表,它包含要新建或修改的属性的名称,以及它们的属性描述符,如: var p = Object.defineProperties({},{ x: {x:1, writable: true, enumerable: false, configurable: true}, y: {x:1, writable: true, enumerable: false, configurable: true}, r: { get: function() {return Math.sqrt(this.x*this.x + this.y*this.y) }, enumerable: true, configrable: true } }); */