js面向对象定义
ECMA-262定义对象:无序的属性集合,其属性可以包含基本值、对象或者函数。
ECMA中有两种属性:数据属性和访问器属性。
1、数据属性
对象属性的默认特性(只为js引擎使用)包含:
[[Configurable]]:描述属性能否被修改,默认值true;
[[Enumberable]]:表示能否通过for-in循环属性,默认值true;
[[Writable]]:表示能否修改属性的值。默认值true;
[[Value]]:包含属性的数据值。默认值undefined;
要修改属性默认的特性,必须使用Object.defineProperty()方法。
var person = {}; Object.defineProperty(person,"name",{ writable:false, value:"zyl" }); console.log(person.name); person.name = "zhang"; console.log(person.name);
显示的结果:第一个:zyl,第二个:zyl
说明person对象的属性name是一个只读的属性。
在调用Object.defineProperty时,如果不置顶特性描述,则默认都为true。
Object.defineProperty不常用,可以用来理解javascript对象。
注意:ie8是第一个实现该方法的浏览器版本。但是,ie8只针对dom对象可用。建议不要使用!!
2.访问器属性
var book = { _year:2004, edit:1 }; Object.defineProperty(book,"year",{ get:function(){ return this._year; }, set:function(newValue){ if(newValue>2004){ this._year = newValue; this.edit += newValue -2004; } } }); book.year = 2005; console.log(book._year);//2005 console.log(book.year);//2005 console.log(len(book));//2 year不是book的真实属性,是访问器属性 console.log(book.edit);//2 function len(obj){ var flag = 0 for(var i in obj){ flag++; } return flag; }