js 面向对象编程
定义:
无序属性值的集合,属性可以是基本值,对象或者是函数。(数组也可以看做是对象,下标是属性名)
数据属性:
configurable :表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性或者能否把属性修改为访问器属性。
enumerable:表示能否通过for-in循环返回属性。
writable:表示能否修改属性的值。
value:包含这个属性的数据值。
要修改属性默认的特性(前三个默认为true,最后一个默认为undefined,这也是为什么属性定义了而未初始化的时候是undefined的原因。)。必须使用Object.defineProperty()方法,这个方法接受三个参数,属性所在的对象、属性的名字和一个描述符对象(上面四个中的一个或者多个)
访问器属性
configurable,enumerable属性同上。
get:在读取属性时调用的函数;
set:在设置属性时候使用的方法。
访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
判断属性位置
通过in和hasOwnProperty()来确定属性是在原型中还是在对象中
in是沿着原型链一直寻找属性,而hasOwnProperty()只在当前对象中寻找。
三种遍历方式
for-in,Object.keys(),Object.getOwnPropertyNames()
防篡改对象
不可扩展 Object.preventExtens(obj);可删除
密封对象Object.seal(obj); 不可扩展,不可删除,已有成员的configurable置为false,但是可写;
冻结对象:Object.freeze(obj),不可扩展,不可删除,不可写;成员的writable置为false。
安全类型检测
function isArray(v){ return Object.prototype.toString.call(v) == '[object Array]'; //'[object RegExp]' '[object Function]' } alert(isArray([]));
测试代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <script type="text/javascript" language="javascript"> var person = {name:'wch'}; person.name = 'wwww'; Object.defineProperty(person,'name',{ writable:false }); person.name = '123'; alert(JSON.stringify(Object.getOwnPropertyDescriptor(person,'name'))); Object.defineProperty(person,'name',{}); alert(JSON.stringify(Object.getOwnPropertyDescriptor(person,'name'))); var book = { _year:2005, edition:1 }; Object.defineProperty(book,'year',{ get:function(){ return this._year; }, set:function(newValue){ this._year = newValue; this.edition ++; } }); book.year = 2009; alert(book.edition); function Person(){ this.name = 'wch'; }; Person.prototype = { name:'111', age:100 }; var person = new Person(); alert(('age' in person) +' : '+ person.hasOwnProperty('age')); for(var key in person){ alert(person[key]); } alert(Object.keys(person)); alert(Object.getOwnPropertyNames(person));
var person = {name : 'wch'}; Object.preventExtensions(person); person.age = 29; alert(person.age); alert(person.name); delete person.name; //可删除 alert(person.name); Object.seal(person); delete person.name; //不可删 alert(person.name); person.name = '11111'; //可以写 alert(person.name); Object.freeze(person); delete person.name; //不可删 alert(person.name); person.name = '11111'; //不可以写 alert(person.name); </script> </body> </html>