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

//继承

/*
在查询时能才体会到继承的存在;

JavaScript对象具有“自有属性”,也有一些属性是从原型对象上继承过来的。
假设要查询对象O的属性X,如果在O中不存在x,那么将会继续从原型对象中查找属性X,如果原型对象中也没有x,但这个原型对象也有原型,那么继续从原型对象的原型上执行查询,直到找到x或者找到一个原型是NULL的对象为止,对象的原型属性构成了一个“链”,通过这个“链”可以实现属性的继承。

现在假设给对象o的属性x赋值,如果o中已经有属性x(这个属性不是继承来的),那么这个赋值操作只改变这个已有的属性x的值,如果o中不存在属性x,那么赋值操作给o添加一个新的属性x,如果之前o继承自有属性x,那么这个继承的属性就被新创建的同名属性覆盖了。
*/

var unitcircle = { r : 1};
var c = inherit(unitcircle);
c.x = 1; c.y = 1; //c定义二个属性
c.r = 2;       // c覆盖继承来的属性

unitcircle.r; // => 1, 原型对象没有修改

/*
如果对象在自有属性或继承过来的属性中没有找到x属性,属性访问表达式返回undefined。如果对象不存在那么视图访问这个不存在的对象的属性就会报错
*/

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



*/
相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
公众号推荐
   一个历史类的公众号,欢迎关注
一两拨千金