JavaScript对象的创建,属性的查询、设置、删除、检测和序列化对象

Admin 2023-04-26 群英技术资讯 305 次浏览

这篇文章给大家分享的是JavaScript对象的创建,属性的查询、设置、删除、检测和序列化对象。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。

目录
  • 创建对象
    • 对象直接量
    • 通过new创建对象
    • 原型
    • Object.create()
  • 属性的查询和设置
    • 继承
    • 属性访问错误
  • 删除属性
    • 检测属性
      • 序列化对象
        • 总结

          创建对象

          对象直接量

          对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。

          var empty = {};
          var point = { x:0, y:0};
          var point2 = {x:point.x, y:point.y+1};
          var book = {
          	"main title":"JavaScript",
          	//属性名字里有空格,必须用字符串表示
          	"sub-title":"The",
          	//属性名字里有连字符,必须用字符串表示
          	"for":"all",
          	//"for"是保留字,必须用字符串表示
          	author:{
          	//这个属性的值是一个对象
          		name:"123"
          		//注意,在里的属性名都没有引号
          	}
          };
          

          通过new创建对象

          var o = new Object();
          //创建一个空对象,和{}一样
          var a = new Array();
          //创建一个空数组,和[]一样
          var d = new Date();
          //创建一个表示当前时间的Date对象
          var r = new RegExp("js");
          //创建一个可以进行匹配的RegExp对象
          

          原型

          所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获得对原型对象的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。因此,同使用{}创建对象一样,通过new Object()创建的对象也继承自Object.prototype。同样,通过new Array()创建的对象的原型就是Array.prototype,通过new Date()创建的对象的原型就是Date.prototype。

          没有原型的对象为数不多,Object.prototype就是其中之一。它不继承任何属性。其他原型对象都是普通对象,普通对象都具有原型。所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型。例如,Date.prototype的属性继承自Object.prototype,因此由new Date()创建的Date对象的属性同时继承自Date.prototype和Object.prototype。这一系列链接的原型对象就是所谓的“原型链”(prototype chain)。

          Object.create()

          创建一个新对象,其中第一个参数是这个对象的原型。Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述。

          Object.create()是一个静态函数,而不是提供给某个对象调用的方法。使用它的方法很简单,只须传入所需的原型对象即可:

          var AB = Object.create({x:1,y:2});
          

          属性的查询和设置

          var a = book.author;
          //得到book的"author"属性
          book.edition = 6;
          //给book创建一个名为"edition"的属性并赋值
          book["main title"] = "123"
          //给"main title"属性赋值
          

          继承

          假设要查询对象o的属性x,如果o中不存在x,那么将会继续在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到x或者查找到一个原型是null的对象为止。

          var o = {}
          o.x = 1;//给o定义一个属性x
          var p = inherit(o);//p继承o
          p.y = 2;//给p定义一个属性y
          var q = inherit(p);//q继承p
          q.z = 3;//给q定义一个属性z
          q.x + q.y // 3 x和y分别继承自o和p
          

          属性赋值操作首先检查原型链,以此判定是否允许赋值操作。如果允许属性赋值操作,它也总是在原始对象上创建属性或对已有的属性赋值,而不会去修改原型链。

          var u = { r:1 };
          var c = inherit(u);
          c.x = 1; c.y =1;
          c.r =2;
          u.r;  // 1 原型对象没有修改
          

          属性访问错误

          当book没有a属性

          book.a // undefined
          var l = book.a.length;
          //抛出一个类型错误异常,undefined没有属性
          

          删除属性

          delete运算符可以删除对象的属性。

          delete book.author;
          //book不再有属性author
          delete book["main title"];
          //book不再有属性"main title"
          

          delete运算符只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它,而且这会影响到所有继承自这个原型的对象)。

          当delete表达式删除成功或没有任何副作用(比如删除不存在的属性)时,它返回true。如果delete后不是一个属性访问表达式,delete同样返回true:

          o = {x:1};
          delete o.x; //删除x,返回true
          delete o.x; //什么都没做(x已经不存在了),返回true
          delete  o.toString; //什么也没做(toString是继承来的),返回true
          delete 1; //无意义,返回true
          

          delete不能删除那些可配置性为false的属性
          在这些情况下的delete操作会返回false:

          delete Object.prototype;//不能删除,属性是不可配置的
          var x = 1; //声明一个全局变量
          delete this.x; //不能删除这个属性
          function f (){}//声明一个全局函数
          delete this.f; //也不能删除全局函数
          

          检测属性

          in运算符的左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true:

          var o = { x:1 }
          "x" in o; //true "x"是o的属性
          "y" in o; //false "y"不是o的属性
          "toString" in o; //true o继承toString属性
          

          对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。对于继承属性它将返回false:

          var o = { x:1 }
          o.hasOwnProperty("x");//true o有一个自有属性x
          o.hasOwnProperty("y");//false o中不存在属性y
          o.hasOwnProperty("toString");//false toString是继承属性
          

          propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性(enumerable attribute)为true时它才返回true。

          var o = inherit({ y:2});
          o.x = 1;
          o.propertyIsEnumerable("x"); //true o有一个可枚举的自有属性x
          o.propertyIsEnumerable("y"); //false y是继承来的
          Object.propertyIsEnumerable("toString"); //false 不可枚举
          

          除了使用in运算符之外,另一种更简便的方法是使用“!==”判断一个属性是否是undefined:

          var o = { x:1 }
          o.x !== undefined; //true o中有属性x
          o.y !== undefined; //false o中没有属性y
          o.toString !== undefined; //true o继承了toString属性
          

          序列化对象

          对象序列化(serialization)是指将对象的状态转换为字符串,也可将字符串还原为对象。ECMAScript 5提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原JavaScript对象。这些方法都使用JSON作为数据交换格式,JSON的全称是“JavaScript Object Notation”

          o = {x:1, y:{z:[false,null,""]}};
          s = JSON.stringify(o);
          //s是'{"x":1,"y":{"z":[false,null,""]}}'
          p = JSON.parse(s);
          // p == o

          到此这篇关于“JavaScript对象的创建,属性的查询、设置、删除、检测和序列化对象”的文章就介绍到这了,更多相关内容请搜索群英网络以前的文章或继续浏览下面的相关文章,希望大家以后多多支持群英网络!
          群英智防CDN,智能加速解决方案
          标签: javascript对象

          免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

          猜你喜欢

          成为群英会员,开启智能安全云计算之旅

          立即注册
          专业资深工程师驻守
          7X24小时快速响应
          一站式无忧技术支持
          免费备案服务
          免费拨打  400-678-4567
          免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
          在线客服
          微信公众号
          返回顶部
          返回顶部 返回顶部
          在线客服
          在线客服