当前位置: 首页 > Web前端 > JavaScript

一篇文章带你玩转JavaScript-Objects

时间:2023-03-27 13:33:01 JavaScript

JavaScript中的一切都是对象:字符串、数字、数组、函数……此外,JavaScript还允许自定义对象。我希望这篇文章可以帮助你创建一个对象。对象字面量是由多个名称/值对组成的映射表。名称/值对由冒号分隔,名称/值对由逗号分隔。整个映射表都包含在花括号中。varempty={};varpoint={x:0,y:0};varpoint2={x:point.x,y:point.y+1};varbook={"maintitle":"JavaScript",//属性名中有空格,必须用字符串表示"sub-title":"The",//属性名中有连字符,必须用字符串"for"表示:"all",//"for"是保留字,必须用字符串表示author:{//该属性的值为对象名:"123"//注意这里没有引号属性名}};通过newvaro=newObject();//创建一个空对象,同{}vara=newArray();//创建一个空数组,同[]vard=newDate();//创建一个代表当前时间的对象Dateobjectvarr=newRegExp("js");//创建一个可以匹配的RegExp对象原型。所有通过对象字面量创建的对象都具有相同的原型对象,原型可以通过JavaScript代码Object.prototype对该对象的引用获得。使用关键字new和构造函数调用创建的对象的原型是构造函数的原型属性的值。因此,和使用{}创建对象一样,通过newObject()创建的对象也继承自Object.prototype。同理,newArray()创建的对象原型为Array.prototype,newDate()创建的对象原型为Date.prototype。Object.prototype是少数没有原型的对象之一。它不继承任何属性。其他的原型对象就是普通对象,普通对象都有原型。所有内置构造函数(以及大多数自定义构造函数)都有一个继承自Object.prototype的原型。比如Date.prototype的属性继承自Object.prototype,那么newDate()创建的Date对象的属性同时继承自Date.prototype和Object.prototype。这一系列链接起来的原型对象就是所谓的“原型链”。Object.create()创建一个新对象,其中第一个参数是这个对象的原型。Object.create()提供了第二个可选参数来进一步描述对象的属性。Object.create()是一个静态函数,不是提供给对象调用的方法。使用方法很简单,传入需要的原型对象即可:varAB=Object.create({x:1,y:2});属性的查询和设置vara=book.author;//获取书籍的“作者”属性book.edition=6;//为书籍创建一个名为“edition”的属性,并赋值book["maintitle"]="123"//给“主标题”属性赋值继承假设要查询对象o的属性x,如果x在o中不存在,那么就继续查询的原型对象中的属性x哦。如果原型对象中没有x,但是这个原型对象也有原型,那么继续查询这个原型对象的原型,直到找到x或者找到一个原型为null的对象。varo={}o.x=1;//为o定义一个属性xvarp=inherit(o);//pinheritsop.y=2;//为p定义一个属性yvarq=inherit(p);//qinheritspq.z=3;//为q定义一个属性zq.x+q.y//3x和y分别继承自o和p属性赋值操作首先检查原型链判断是否允许赋值操作.如果允许属性赋值,它总是在原始对象上创建属性或为现有属性赋值,而不修改原型链。varu={r:1};varc=inherit(u);c.x=1;c.y=1;c.r=2;u.r;//1prototypeobjectdoesnotmodifypropertyaccesserrorwhenbookdoesnothaveapropertybook.a//undefinedvarl=book.a.length;//抛出类型错误异常,undefinedhasnoattributedelete属性删除操作符可以删除对象的属性。deletebook.author;//book不再有属性authordeletebook["maintitle"];//book不再有属性"maintitle"delete操作符只能删除自己的属性,不能删除继承的属性(删除继承的属性必须从定义该属性的原型对象中删除,这会影响从原型继承的所有对象)。当delete表达式删除成功或没有任何副作用(例如删除不存在的属性)时,它返回true。如果delete不是属性访问表达式,delete也返回true:o={x:1};deleteo.x;//删除x,返回truedeleteo.x;//什么都不做(x不再存在),返回truedeleteo.toString;//什么都不做(继承toString),返回truedelete1;//无意义,返回truedelete不能删除那些configurability为false的属性,这种情况下delete操作会返回false:deleteObject.prototype;//不能删除,属性不可配置varx=1;//声明一个全局变量deletethis.x;//cannotdeletethispropertyfunctionf(){}//声明一个全局函数deletethis.f;//不能删除全局函数检测属性。in运算符的左侧是属性名(字符串),右侧是对象。如果对象自身或继承的属性包含此属性,则返回真:varo={x:1}"x"ino;//true"x"是o"y"在o中的一个属性;//false"y"不是o中o"toString"的属性;//trueo继承toString属性对象的hasOwnProperty()方法用于检测给定名称是否为对象自身属性。对于继承的属性会返回false:varo={x:1}o.hasOwnProperty("x");//trueo有自己的属性xo.hasOwnProperty("y");//falseo中不存在Propertyyo.hasOwnProperty("toString");//falsetoString是一个继承的属性propertyIsEnumerable()是hasOwnProperty()的加强版,只有当它被检测为自己的属性并且这个属性的可枚举属性为true时才行返回真。varo=inherit({y:2});o.x=1;o.propertyIsEnumerable("x");//trueo有一个可枚举的自有属性xo.propertyIsEnumerable("y");//falsey是继承的Object.propertyIsEnumerable("toString");//false不可枚举除了使用in运算符之外,还有一种更简单的方法是使用“!==”来判断属性是否未定义:varo={x:1}o.x!==undefined;//trueo有属性xo.y!==undefined;//falseo没有属性yo.toString!==undefined;//trueo继承toString属性序列化对象对象序列化(serialization)是指将对象的状态转换为字符串,也可以将字符串还原为对象。ECMAScript5提供内置函数JSON.stringify()和JSON.parse()来序列化和恢复JavaScript对象。这些方法都使用JSON作为数据交换格式。JSON的全称是“JavaScriptObjectNotation”o={x:1,y:{z:[false,null,""]}};s=JSON.stringify(o);//s是'{"x":1,"y":{"z":[false,null,""]}}'p=JSON.parse(s);//p==o