JavaScript的检测属性、属性特性、枚举属性


/*
检测属性
检测属性可以通过三种方式
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
	}
});
*/

  

原文地址:https://www.cnblogs.com/zhuyang/p/4366078.html