我的javascript权威指南-5
来源:互联网 发布:阿里巴巴大数据分析 编辑:程序博客网 时间:2024/05/20 08:44
1. 对象概述:
对象是一种复合值。它将多个值聚合在一起可以通过名字访问这些值。对象可以看成无序集合,每个属性都是一个名值对。对象除了自己的属性方法,还可以从一个称为原型的对象上继承属性。这是“原型式”继承是javascript核心。
2. javscript语言:
javscript语言是动态的,可以新增属性也可以删除属性。
除了字符串、数字、true、false、null和undefined外,javascript中的值都是对象。而字符串、数字、true、false、null和undefined它们的行为和不可变对象非常类似。
3. 属性:
属性包括名字和值。属性名可以使包含字符串在内的任意字符串,但对象中不能存在两个同名属性除了名字和值,每个属性都有一些与之相关的值,称为“属性特征”
- 可写,表明是否可以设置该属性的值
- 可枚举,表明是否可以通过for in循环返回该属性值
- 可配置,表明是否可以删除或修改该属性的值
除了包含属性之外,每个对象还有三个相关的对象特征
- 对象的原型:指向另一个对象,对象的属性都是继承自它的原型对象
- 对象的类:是一个标识对象类型的字符串
- 对象的拓展标记:指明了是否可以向该对象添加新属性
最后用下面术语对三类javascript对象和两类属性做区分
- 内置对象:由ECMAScript规范定义的对象或类。例如数组、函数
- 宿主对象:所有非本地对象都是宿主对象(host object),即由ECMAScript 实现的宿主环境提供的对象。所有 BOM 和 DOM 对象都是宿主对象。
- 自定义对象:由运行中的javascript代码创建的对象
- 自有属性:直接在对象上定义的属性
- 继承属性:在对象原型对象中定义的属性
4. 创建对象
- 字面量
- new运算符
字面量:var obj={};obj.x=3;var lcg={ y:'yes'}
new运算符var obj=new Object();obj.z=33;
5. 原型
每个对象都有一个关联对象(除了null),那就是原型。
- 通过{}和new运算符创造的对象都继承自Object.prototype。就像new Date()创造的实例对象的属性继承自Date.prototype一样。而这一系列原型对象所组成的就是所谓的原型链。
- 没有原型的对象并不多,Object.prototype就是其中一个。
6. Object.create()
- 语法:Object.create(proto[, propertiesObject])
- 参数说明:
- proto
新创建对象的原型对象。 - propertiesObject 可选。如果没有指定为undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
- 返回值:在指定原型对象上添加新属性后的对象。
- 注意:如果proto参数不是 null 或一个对象,则抛出一个 TypeError 异常。
- 示例:(其实就是个寄生组合式继承)
- proto
// Shape - superclassfunction Shape() { this.x = 0; this.y = 0;}// superclass methodShape.prototype.move = function(x, y) { this.x += x; this.y += y; console.info('Shape moved.');};// Rectangle - subclassfunction Rectangle() { Shape.call(this); // call super constructor.}// subclass extends superclassRectangle.prototype = Object.create(Shape.prototype);Rectangle.prototype.constructor = Rectangle;var rect = new Rectangle();
7. 继承
javascript对象具有“自有属性”,也具有从原型对象上继承的属性。
- 如果要给一个对象的属性赋值,如果已经有了这个属性,且这个属性是自有的,那么这个操作只会改变属性的值。如果不存在,那么就会添加并赋值。如果是继承来的,那么这个属性会被同名属性覆盖。
8. 删除属性
- delete可以删除属性,但它仅仅是断开属性和宿主对象的联系而不会去操作属性中的属性。
- delete只能删除自有属性,无法删除继承属性。
- 成功删除时delete会返回一个true,否则返回false。如果delete后面跟的不是属性访问表达式,也会返回true。
- delete无法删除可配置型为false的属性。
- 在非严格模式中,这些情况下delete会返回false。
delete Object.prototype //属性是不可配置的var x=1;delete this.x //无法删除全局变量function a(){}delete this.a; //同样无法删除全局函数
9. 检测属性
- 常见的方法:
- in运算符
- hasOwnproperty()
- propertyIsEnumerable()
-
- in运算符返回true(不区分是自有属性还是继承属性)
- hasOwnproperty()只检测是不是自有属性,是的话返回true
- propertyIsEnumerable()只有是自有属性同时可枚举性为true才会返回true
- 下面是示例
var o={a:12}"a" in o ; //true
var o={a:12}o.hasOwnproperty('x'); //true
var o={a:12}o.propertyIsEnumerable('x'); //true
- 另一种更简单的方法
var o={a:12}o.x !== undefined //true
但是上述方法有一个缺憾,比如
var o={a:undefined}o.x !== undefined //false
但是显然上面的对象是存在这个属性的
9. 枚举属性
除了for in循环外,es5还定义了两个可以枚举属性名的函数
- Object.keys()
它返回一个数组,这个数组由可枚举的自有属性名称组成。
- Object.getOwnpropertyNames();
它也返回一个数组,这个数组由自有属性名称组成。(不可枚举的一样能取到)
10.getter和setter
- 对象的属性值可以用一或两个方法替代,这两个方法就是getter和setter。由getter和setter定义的属性称作“读取器属性”。它不同于“数据属性”,数据属性只有一个简单的值。
- 与数据属性不同,如果属性同时具有getter和setter两个方法,它就具有可读写性。如果只具有getter它就只有可读性,反之只有可写性。
- 和数据属性一样,存储器属性是可以继承的。
下面用getter实现一种“神奇属性”。
var random={ get octet(){ return Math.floor(Math.random()*256) }, get uint16(){ return Math.floor(Math.random()*65536) }, get int16(){ return Math.floor(Math.random()*65536)-32768; }}
11.对象的三个属性
- 原型属性
- 定义:对象的原型属性是继承来的
- 检测:isPrototypeOf()方法
a.isPrototypeOf(b);
类属性
- 定义:用来表示对象类型信息的一个字符串
- 获取:调用toString(),然后返回第八个到倒数第二个位置之间的字符
- 很多对象继承的toString()被重写,为了调用正确的toString(),得间接调用Function.call()
可拓展性
- 定义:表示是否可以给对象添加新属性
- 判断:Object.preventExtensible()
- 转换为不可拓展:Object.preventExtensions()
- Object.seal():也能设置不可拓展,同时可以把自有属性设置为不可配置。
12.对象序列化
- 定义:将对象的状态转为字符串,也可将字符串还原为对象
- 方法:JSON.stringify()和JSON.parse()
- 测试:
var o={x:1,y:{z:2}}; //测试对象var s=JSON.stringify(o);var p=JSON.parse(s);
13.对象方法
- toString():返回调用这个方法的对象值的字符串(可以接收参数,转换进制)
- toLocaleString():返回调用这个方法对象的本地化字符串。
- toJSON():Object.prototype实际上没有定义这个方法,但对于需要序列化的对象来说,JSON.stringify()方法会调用toJSON()。如果待序列化的对象存在这个方法则调用它,返回序列化结果。
- valueOf():当需要将对象转换为某种非字符串时才会调用。
- 我的javascript权威指南-5
- 我的javascript权威指南-6
- 我的javascript权威指南-7
- 我的javascript权威指南-8
- 我的javascript权威指南-9
- 我的javascript权威指南-10
- 我的javascript权威指南-11
- 我的javascript权威指南-12
- 我的javascript权威指南-13
- javascript权威指南学习5
- javascript权威指南 锋利的jquery css权威指南
- javascript权威指南的一点总结
- javaScript权威指南之类的创建
- [Books] 《JavaScript权威指南》 -- #1~5
- JavaScript权威指南
- JavaScript权威指南
- 《JavaScript权威指南》读书笔记
- javascript权威指南读书笔记
- 防止域名证书劫持,阿里云解析率先支持CAA
- jvm中新生代和老年代的理解
- 基于密度方法的聚类
- 分布式数据库拆表拆库的常用策略
- 开篇一题
- 我的javascript权威指南-5
- zookeeper应用场景-负载均衡
- Android中常出现内存泄漏的情况
- TOMCAT开放远程调试端口
- Java面经整理_Collection
- js数组的比较
- Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
- C# 高级编程 泛型
- java几种常用设计模式简单示例