对象中包含一系列属性,这些属性是无序的。每个属性都有一个字符串key和对应的value。
var obj = {}; obj[1] = 1; obj['1'] = 2; obj;//Object{1:2} obj[{}] = true; obj[{x:1}] = true; obj;//Object{1:2,[object Object]:true}
一.创建对象
1.字面量
var obj1 = {x:1,y:2}; var obj2 = { x:1, y:2, o: { z:3, n:4 } };
2.new/原型链
function foo() {} foo.prototype.z = 3; var obj = new foo(); obj.y=2; obj.x=1; obj.x;//1 obj.y;//2 obj.z;//3 typeof obj.toString;//'function' 'z' in obj;//true obj.hasOwnProperty('z');//false obj.z = 5; obj.hasOwnProperty('z');//true foo.prototype.z;//still 3 obj.z;//5 obj.z = undefined; obj.z;//undefined delete obj.z;//true obj.z;//3
3.Object.create
var obj = Object.create({x:1}); obj.x;//1 typeof obj.toString;//"function" obj.hasOwnProperty('x');//false var obj = Object.create(null); obj.toString;//undefined
二.属性操作
1.读写对象属性
var obj = {x:1,y:2}; obj.x;//1 obj["y"];//2 var obj = {x1:1,x2:2}; var i=1,n=2; for(;i<=n;i++) { console.log(obj['x'+i]); } //输出:1,2 var p; for(p in obj) { console.log(obj[p]); }
2.属性读写-异常
var obj = {x:1}; obj.y;//undefined var yz=obj.y.z;//TypeError:Cannot read property 'z' of undefined obj.y.z=2;//TypeError:Cannot set property 'z' of undefined var yz; if(obj.y) { yz = obj.y.z; } var yz = obj && obj.y && obj.y.z;
3.删除属性
var person = {age:28,title:'fe'}; delete person.age;//true delete person['title'];//true person.age;//undefined delete person.age;//true delete Object.prototype;//false var descriptor = Object.getOwnPropertyDescriptor(Object, 'prototype');//获得Object对象的prototype属性描述器 descriptor.configurable;//false
var定义的全局变量或局部变量,不能被删除。
var globalVal = 1; delete globalVar;//false (function() { var localVal = 1; return delete localVal; }());//false function fd(){} delete fd;//false (function() { function fd() {}; return delete fd; }()); //false ohNo = 1; window.ohNo;//1 delete ohNo;//true
4.检测属性
var cat = new Object; cat.legs = 4; cat.name = "Kitty"; 'legs' in cat;//true 'abc' in cat;//false "toString" in cat;//true,inherited property!!! cat.hasOwnProperty('legs');//true cat.hasOwnProperty('toString');//false cat.propertyIsEnumerable('legs');//true cat.propertyIsEnumerable('toString');//false自定义属性,可以让其枚举为false,可用Object.defineProperty
//自定义属性,可以让其枚举为false Object.defineProperty(cat, 'price', {enumerable:false, value:1000}); cat.propertyIsEnumerable('price');//false cat.hasOwnProperty('price');//true if(cat && cat.legs) { cat.legs *= 2; } if(cat.legs != undefined) { //!==undefined or !== null } if(cat.legs !== undefined) { //only if cat.legs is not undefined }
5.枚举属性
var o = {x:1,y:2,z:3}; 'toString' in o;//true o.propertyIsEnumerable('toString');//false var key; for(key in o) { console.log(key);//x,y,z } var obj = Object.create(o); obj.a = 4; var key; for(key in obj) { console.log(key);//a,x,y,z } var obj = Object.create(o); obj.a = 4; var key; for(key in obj) { if(obj.hasOwnProperty(key)) { console.log(key);//a } }
三.get/set方法
var man = { name:'Bosn', weibo:'@Bosn', get age() { return new Date().getFullYear()-1988; }, set age(val) { console.log('Age can\'t be set to '+val); } } console.log(man.age);//27 man.age = 100;//Age can't be set to 100 console.log(man.age);//still 27
var man = { weibo:'@Bosn', $age:null, get age() { if(this.$age == undefined) { return new Date().getFullYear() - 1988; }else { return this.$age; } }, set age(val) { val =+val; if(!isNaN(val) && val > 0 && val < 150) { this.$age =+ val; }else { throw new Error('Incorrect val = ' + val); } } } console.log(man.age);//27 man.age = 100; console.log(man.age);//100 man.age='abc';//error:Incorrect val = NaNget/set与原型链
function foo() {} Object.defineProperty(foo.prototype, 'z', {get:function() {return 1;}}); var obj = new foo(); obj.z;//1 obj.z = 10; obj.z; //still 1 Object.defineProperty(obj, 'z', {value:100, configurable:true}); obj.z;//100 delete obj.z; obj.z;//back to 1
var o = {}; Object.defineProperty(o, 'x', {value:1});//writable=false,configurable=false var obj = Object.create(o); obj.x;//1 obj.x = 200; obj.x;//still 1, can't change it Object.defineProperty(obj, 'x', {writable:true, configurable:true, value:100}); obj.x;//100 obj.x = 500; obj.x;//500
四.属性标签
//Object.getOwnPropertyDescriptor方法第一个参数是要判断的对象,第二个参数是要判断的属性名 Object.getOwnPropertyDescriptor({pro:true}, 'pro'); //Object {value:true, writable:true, enumerable:true,configurable:true} Object.getOwnPropertyDescriptor({pro:true}, 'a');//undefined var person = {}; Object.defineProperty(person, 'name', { configurable:false, writable:false, enumerable:true, value:"Bosn Ma" }); person.name;//Bosn Ma person.name = 1; person.name;//still Bosn Ma delete person.name;//false Object.defineProperty(person, 'type', { configurable: true, writable:true, enumerable:false, value:"Object" }); Object.keys(person);//["name"],因为type属性的enumerable为false
相关推荐
javascript深入浅出百度云地址: http://pan.baidu.com/s/1kUVYoXD 密码在文档中,下载下来后就可以看到了
javascript深入浅出高清扫描版,易于初学者学习
《深入浅出JavaScript》PDF版本下载
JavaScript中的对象 ECMA262规范一直在强调,“ECMAScript是一种基于对 象(Object—Based)的语言,而不是传统的面向对象(Object— Oriented)的语言”。相信绝大多数人不会清楚这句话是什么意 思。我想我们可以把它...
深入浅出Javascript 深入浅出Javascript
为了启发你的思考,《深入浅出JavaScript(中文版)》覆盖了所有的javascript基本知识,从基本网络编程技巧,如变量、函数和循环语句,到高级一些的专题,如表单验证、dom操作、客户端对象、脚本程序调试——甚至是...
深入浅出JavaScript源代码 深入浅出JavaScript源代码 图灵教材
JS-JavaScript深入浅出JS-JavaScript深入浅出JS-JavaScript深入浅出
深入浅出javascript的源代码.值得学习
《深入浅出JavaScript》(Beginning JavaScript with DOM Scripting and Ajax)高清扫描版[PDF].part1
为了启发你的思考,《深入浅出javascript(中文版)》覆盖了所有的java script基本知识,从基本网络编程技巧,如变量、函数和循环语句,到高级一些的专题,如表单验证、dom操作、客户端对象、脚本程序调试——甚至是...
深入浅出JavaScript 深入浅出JavaScript 深入浅出JavaScript
深入浅出JavaScript.part7.rar深入浅出JavaScript.part7.rar
深入浅出JavaScript源代码.zip,各种JavaScript源代码丰富学习!
深入浅出Javascript压缩包2--一本注重实践的javascript电子书
JavaScript学习笔记JavaScript学习笔记
本书是一部优秀的、注重实践的JavaScript教程。作者首先概览了JavaScript,包括它的语法、良好的编码习惯、DOM编程原则等;然后构建了JavaScript工具包,包括动态操作标记、使用CSS和... 深入浅出JavaScript.part12.rar