JavaScript之对象
来源:互联网 发布:国泰君安快期交易软件 编辑:程序博客网 时间:2024/05/01 18:54
概述
- 可写 ,表明是否可以设置该属性的值
- 可枚举,表明是否可以通过for/in循环返回该属性
- 可配置,表明是否可以删除或修改该属性
- 对象的原型(prototype)指向另一个对象,本对象的属性继承自它的原型对象
- 对象的类(class)是一个标识对象类型的字符串
- 对象的扩展标记(extensible flag)指明了是否可以向该对象添加新属性
创建对象
var 0 =Object.create({x:1 ,y:2});
var o3 = Object.create(Object.prototype)//等同于new Object() 和{}
如果给继承对象的属性赋值,则这些属性只会影响这个继承对象自身,而不是原始对象。
属性的查询和设置
对于点(.)来说,右侧必须是一个以属性名称命名的简单标识符。对于方括号来说([]),方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字。var addr = ""for(i =0;i>4;i++){ addr+=customer["address"+i]+'\n'}
var len = book && book.subtitle && book.subtitle.length
- o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有例外,可以对可配置的只读属性重新赋值)
- o中的属性p是继承属性,且他是只读的:不能通过同名自有属性覆盖只读的继承属性
- o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性是false。如果o中不存在p,且没有setter方法可供条约,则p一定会添加至o中。但如果o不是可扩展的,那么在o中就不能定义新属性
删除属性
检测属性
枚举属性
属性getter和setter
属性的特性
var o={x:1}Object.getOwnPropertyDescriptor(o,"x")//Object {value: 1, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor()只能获得自有属性的描述符
Object.defineProperty(o,"x",{value:2,enumerable:false}) //Object {x: 2}o.x //2Object.keys(o) //[]
传入Object.defineProperty()的属性描述符对象不必包含所有4个特性。对于新创建的属性来说,默认的特性值是false或undefined。对于修改已有的属性,则默认不做任何改变。注意,该方法要么是修改已有属性有么新建自有属性,不能修改继承属性
var p = Object.defineProperties({},{ x:{value:1,writable:true,enumerable:true,configurable:true}, y:{value:1,wtitable:false}, r:{ get: function(){return Math.sqrt(this.x*this.x+this.y*this.y)}}})
对象的三个属性
原型属性是在实例对象创建之初就设置好的,通过对象直接量创建的对象使用Obejct.prototype作为它们的原型。通过new创建的对象使用构造函数的prototype属性作为她的原型。通过Obejct.create()创建的对象的使用第一个参数(也可以是null)作为它们的原型
在ES5中,将对象作为参数传入Obejct.getPrototypeOf()可以查询它的原型。ES3中可以用o.constructor.prototype来检测对象原型,但这种方法并不可靠——对于对象直接量有效,但对于通过Object.create()创建的对象则往往不是这样
检测一个对象是否是另一个对象的原型(或处于原型链),可以使用isPrototypeOf()方法.比如p.isPrototypeOf(o)可以检测p是不是o的原型
要想获得对象的类,可以调用对象的toString()方法,然后提取已返回字符串的第8个到倒数第二个位置直接到字符(由于很多对象重写toString,因此应该采用call)
Object.prototype.toString(0).slice(8,-1)
通过内置构造函数创建的对象包含类属性,它与构造函数名称相匹配。宿主对象也包括有意义的类属性,但着依赖于具体的js实现。自定义构造函数创建的对象的类属性是Object,而对象直接量和Object.create()也是如此
对象的可扩展性用于表示是否可以给对象添加新对象。在ES5中,所有的内置对象和自定义对象都是可扩展的,除非手动转化
Object.preventExtensions()可以将对象转化为不可扩展,而不可扩展无法变为可扩展。而Object.isExtensible()则用来判断。此外,如果给一个不可扩展的对象的原型添加属性,这个不可扩展的对象统一会继承这些新属性
Object.seal()个Object.preventExtensions()类似,除了能够将对象设置为不可扩展的,还可以将对象的所欲呕自有属性都设置为不可配置的。
对于那些已封闭起来的对象是不可解封的。可以用Object.isSealed()来检测对象是否封闭
Object.freeze()则更严格,除了将对象设置为不可扩展和将属性配置为不可配置,还会将所有属性设置为只读。setter不受影响
Object.isFrozen()用于检测
序列化对象
ES5内置了JSOO.stringify()和JSON.parse()用来序列号和还原js对象。
JSON支持对象、数组、字符串、无穷大数字、布尔值和null的序列号和还原。(日期会变为字符串)
对象方法
Object中默认的toLocaleString()方法并不作任何本地化操作,只是调用toString()方法并返回对应值。Date()和Number()的toLocaleString()方法做了定制,而Array会对每一个元素都调用toLocaleString()
对于需要执行序列化的对象来说,JSON.stringify()方法会调用toJSON()方法。若待序列化的对象存在该方法,则调用,返回值即是序列化的结果,而不是原始对象
- javascript对象之javascript数组
- JavaScript对象之Boolean
- JavaScript基础之对象
- JavaScript基础之对象
- JavaScript基础之对象
- Javascript之浏览器对象
- JavaScript之基于对象
- JavaScript之document对象
- JavaScript基础之对象
- javascript之Dom对象
- JavaScript之修改对象
- JavaScript之事件对象
- javascript 之面向对象
- JavaScript之事件对象
- javascript之Boolean对象
- Javascript之Date对象
- Javascript之Math对象
- Javascript之Number对象
- win10 opencv 项目程序移植到 ubuntu16.04: 3.项目自启动和修改分辨率
- 电脑组装之前期摸索一
- 总结String类字符串与其他类型的转换
- LeetCoder 16 3Sum Closest
- 标准对话框
- JavaScript之对象
- 阿里云ECS+CentOS 7.0+Docker+Redmine环境搭建
- requestDispatcher和sendRedirect的区别和联系
- Java泛型_下限_super
- 安全管理·十七
- 55. Jump Game
- Java笔试题解(3)
- git
- (3)