javascript权威指南(6) - 对象
JavaScript对象可以从一个称为原型的对象继承属性,这种"原型式继承"(prototypal inheritance)是JavaScript的核心特征。除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。对象时可变的,可以增加或者删除对象的属性,通过引用而非值来操作对象。
对象的常见用法是create对象以及设置(set), 查找(query), 删除(delete), 检测(test), 枚举(enumerate)对象的属性。
对象中不能存在同名的属性,属性值可以是任意JavaScript值,或者(ECMAScript5中)可以是一个getter或setter函数(或者两者都有)。除此之外,每个属性还有一些与之相关的值,称为"属性特征",如可写(writable)、可枚举(enumerable)、可配置(configurable)。
除了包含属性之外,每个对象还拥有三个相关的对象特性:
对象的原型(prototype):指向另外一个对象,本对象的属性继承自它的原型对象。
对象的类(class):是一个标识对象类型的字符串。
对象的扩展标记(extensible flag):指明了(ECMAScript5中)是否可以向该对象添加新属性。
三类JavaScript对象和两类属性:
内置对象(native object): 由ECMAScript规范定义的对象或类。例如Arrays, functions, dates, 和regular expressions。
宿主对象(host object): 由JavaScript解释器所嵌入的宿主环境(例如web browser)定义的. 如HTMLElement。宿主对象也可以当做内置对象。
自定义对象(user-defined object): 由运行中的JavaScrip代码创建的对象。
自有属性(own property): 直接在对象中定义的属性。
继承属性(inherited property): 在对象的原型对象中定义的属性。
#1 创建对象
可以通过对象直接量、关键字new和(ECMAScript5中)Object.create()函数来创建对象。
对象直接量:
var book = {
"main title": "JavaScript", // Property names include spaces,
'sub-title': "The Definitive Guide", // and hyphens, so use string literals
"for": "all audiences", // for is a reserved word, so quote
author: { // The value of this property is
firstname: "David", // itself an object. Note that
surname: "Flanagan" // these property names are unquoted.
}
};
通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获得对原型对象的引用。
通过new创建对象(JavaScript语言核心中的原始类型都包含内置构造函数):
var o = new Object(); // Create an empty object: same as {}.
var a = new Array(); // Create an empty array: same as [].
var d = new Date(); // Create a Date object representing the current time
var r = new RegExp("js"); // Create a RegExp object for pattern matching.
通过new关键字和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。如Object.prototype, Array.prototype和Date.prototype等。
Object.create():
var o1 = Object.create({x:1, y:2}); // o1继承了属性x和y.
var o2 = Object.create(null); // o2不继承任何属性和方法,因此不能和"+"运算符一起正常工作
var o3 = Object.create(Object.prototype); // o3和{}或者new Object()一样.
#2 属性的查询和设置
可以通过点(.)或方括号([])运算符来获取属性的值,或者创建属性和设置属性。
var author = book.author; // Get the "author" property of the book.
var name = author.surname // Get the "surname" property of the author.
var title = book["main title"] // Get the "main title" property of the book. book.edition = 6; // Create an "edition" property of book.
book["main title"] = "ECMAScript"; // Set the "main title" property.
作为关联数组的对象
数组元素通过字符串索引而不是数字索引(如object["property"]),这种数组就是关联数组,也称作散列、映射或字典(dictionary)。JavaScript对象都是关联数组。
function addstock(portfolio, stockname, shares) {
portfolio[stockname] = shares; // 使用关联数组
}
继承
只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关,这是JavaScript的一个重要特性,让程序员可以有选择的覆盖(override)继承的属性。
var unitcircle = { r:1 }; // 供继承的对象
var c = inherit(unitcircle); // c 继承属性 r
c.x = 1; c.y = 1; // c 定义了两个自己的属性
c.r = 2; // c 覆盖其继承的属性
unitcircle.r; // => 1: 原型对象不受影响
属性访问错误
book.subtitle; // => undefined: 属性不存在 // 抛出一个类型异常错误. undefined没有length属性
var len = book.subtitle.length; // 一种更简练的常用方法,获得subtitle的length属性或undefined
var len = book && book.subtitle && book.subtitle.length; // 内置构造函数的原型是只读的
Object.prototype = 0; // 赋值失败,但没有报错; Object.prototype没有修改
#3 删除属性
delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性;delete预算福只能删除自有属性,不能删除继承属性。当delete表达式删除成功或者没有任何副作用(比如删除不存在的属性)时,返回true。
o = {x:1}; // o有一个属性x, 并继承属性toString
delete o.x; // 删除x, 返回true
delete o.x; // 什么都没做(x已经不存在了), 返回true
delete o.toString; // 什么都没做(toString是继承来的), 返回true
delete 1; // 无意义, 返回true
不能删除那些可配置性为false的属性,某些内置对象的属性是不可配置的,比如通过变量声明和函数声明创建的全局对象的属性。
delete Object.prototype; // 不能删除,属性是不可配置的
var x = 1; // 声明一个全局变量
delete this.x; // 不能删除这个属性
function f() {} // 声明一个全局函数
delete this.f; // 也不能删除全局函数
在非严格模式中删除全局对象的可配置属性时,可以省略对全局对象的引用。
this.x = 1; // 创建一个可配置的全局属性(没有用 var)
delete x; // 将它删除
在严格模式中会报语法错误。
delete x; // 在严格模式下报语法错误
delete this.x; // 正常工作
javascript权威指南(6) - 对象的更多相关文章
- JavaScript权威指南--window对象
知识要点 window对象及其客户端javascript所扮演的核心角色:它是客户端javascript程序的全局对象.本章介绍window对象的属性和方法,这些属性定义了不同的API,但是只有一部分 ...
- JavaScript权威指南 - 对象
JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...
- 【笔记】javascript权威指南-第六章-对象
对象 //本书是指:javascript权威指南 //以下内容摘记时间为:2013.7.28 对象的定义: 1.对象是一种复合值:将很多值(原始值或者对象)聚合在一起,可以通过名字访问这些值. ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- 《javascript权威指南》读书笔记——第一篇
<javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...
- Javascript权威指南
一.数字写法 3.14 2345.789 .333333333333333333 6.02e23 // 6.02 × 10 23 1.4738223E-32 // 1.4738223 × 10 −32 ...
- 《JavaScript权威指南 第六版 中文版》(一)
<JavaScript权威指南 第六版 中文版> 第二章 词法结构 2.1字符集 JavaScript是使用Unicode字符集编码写的. 2.1.1区分大小写 JavaScript是区分 ...
- javascript权威指南第6版学习笔记
javascript权威指南第6版学习笔记 javascript数组.函数是特殊对象 看一点少一点. 3.1.4 hello.js内容是 var x=.3-.2;var y=.2-.1 console ...
随机推荐
- 读书时间《JavaScript高级程序设计》七:表单
在HTML中表单是有<form>元素表示,在JS中表单对应的是HTMLFormElement类型. 表单自有的属性和方法: 获取表单 1. 通过ID document.getElemen ...
- iis6开户gzip 网站属性里面没有服务选项卡
请注意一点,是直接在名为“网站”的文件夹上面右键选择属性,不是去点下面建立的某一个网站.开户GZIP是整台服务器上面的虚拟主机都同时开启的,不对针某一个单独网站. 开启Gzip具体步骤: 1. 在 & ...
- C#访问Java的WebService添加SOAPHeader验证的问题
原文:C#访问Java的WebService添加SOAPHeader验证的问题 这两天做与公司OA的接口,发现C#访问Java的WebService需要提供一个SOAP的头验证信息,但是WebServ ...
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl 后篇 --事件冒泡 系列文章链接: ASP.NET ...
- 【Android基础】listview控件的使用(2)-------继承自ListActivity的普通listview
由于listview在android控件中的重要性,所以android为我们直接封装了一个类ListviewActivity,直接将listview封装在了activity之中,在本篇中,我将介绍在L ...
- RedHat Linux乱码解决方案(转)
RedHat Linux中出现中文乱码主要是由于没有安装中文字体,因此解决方案主要是安装中文字体,所以 第一步,挂载安装的光盘 在虚拟机的菜单栏里,选择:VM->Settings,点击Setti ...
- POST和Get辨析
在Form里面,能够使用post也能够使用get.它们都是method的合法取值,可是两者也有不同,主要差别在于传递和获取參数的方式不同 一.Get方法: 1.參数的传递方式: 通过URL请求来传递用 ...
- flask+gevent+gunicorn+nginx 初试
1.安装flask pip install flask 2.安装gevent pip install gevent 3.安装gunicorn pip install gunicorn 版本信息例如以下 ...
- JDK5什么是新的堵塞队列线程(四)
一. 堵塞队列与普通队列: 队列是一种主要的数据类型,其典型特征是先进先出. 堵塞队列和普通队列的差别在于: 当队列为空时.从队列中获取元素的线程会被堵塞.直到其它的线程往空的队列里插入新的元素: 当 ...
- 翻译器DIY————次序
突然有一种冲动,想要写一个编译器. 因此,检查在网上搜索相关信息,思想direct3D 有本书叫龙,也有个龙书 Compilers Principles,Techniques, & Tool ...