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 quoteauthor: { // The value of this property isfirstname: "David", // itself an object. Note thatsurname: "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.prototypeDate.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; // 正常工作

转载于:https://www.cnblogs.com/thlzhf/p/3992803.html

javascript权威指南(6) - 对象相关推荐

  1. JavaScript权威指南--window对象

    知识要点 window对象及其客户端javascript所扮演的核心角色:它是客户端javascript程序的全局对象.本章介绍window对象的属性和方法,这些属性定义了不同的API,但是只有一部分 ...

  2. 经典的《JavaScript 权威指南》中的“对象”不经典

    这些天在为Qomo项目写"JavaScript面向对象的支持"这组文章.也一直在期待网上购得的那本<JavaScript 权威指南>(第四版)快快到来. 在前公司,有这 ...

  3. 《JavaScript权威指南》笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> <JavaScript权威指南>真是名符其实的好书!真遗憾初学JavaScript时没有立即读这本书,甚为遗憾.不 ...

  4. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  5. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! JavaScript 权威指南-学习笔记 ...

  6. Javascript权威指南学习笔记一:数据类型

    决定从最基础的开始学JavaScript,最近看了<<Javascript权威指南>>第3章,记些笔记备忘. 本章一个重点是类型.按我的理解应该如下表所示: 复合类型中,关联数 ...

  7. 《JavaScript权威指南》——JavaScript核心

    前言 这本由David Flanagan著作,并由淘宝前端团队译的<JavaScript权威指南>,也就是我们俗称的"犀牛书",算是JS界公认的"圣经&quo ...

  8. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  9. javascript权威指南 学习笔记之变量作用域

    最近一直在看<javascript权威指南 第五版>,变量作用域这一章,看得真的有点累.不过,收获还是多多. 不知道,大家对语言中变量的"声明"与"定义&qu ...

最新文章

  1. 【转】java接口的性能测试
  2. JDK14性能管理工具:jmap和jhat使用介绍
  3. 服务交付审查:缺失的DevOps反馈环
  4. mysql linux 迁移mac_Mac和Linux之间传输数据,并导出mysql数据到本地
  5. MySQL中OR和AND的区别是什么____MySQL中or与in
  6. 出身寒门的程序员,如何改变命运?
  7. MSP430程序库二UART异步串口
  8. MySQL-----改
  9. 避免使用PHP保留字作为常量、类名和方法名,以及命名空间的命名
  10. 列表ListBox、ListView、GridView 排序
  11. 更改Edge浏览器缓存位置
  12. pc微信 hook 微信hook 最新版源码3.5 demo下载地址
  13. 动软代码生成器生成数据库文档 (转载)
  14. Mysql数据库常用命令总结
  15. 微型计算机vga什么意思,电脑显示器显示vga什么意思
  16. 侧滑菜单--狸菇凉_
  17. 【Pygame小游戏】真香~这款百万销量万人追捧大富翁游戏终于出现了~(赶紧来玩儿)
  18. 汽车辅助驾驶系统中的图像处理算法
  19. Unity技能工厂——字体替换工具功能的实现!
  20. 构建人工智能评测平台(体系)

热门文章

  1. apache禁止訪问某些文件或文件夹的方法
  2. Android前后端交互细节--Json转化为对象的原理
  3. CSS3的线性渐变(linear-gradient)
  4. 站内搜索——Lucene +盘古分词
  5. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
  6. 寻找先序遍历中第k个节点
  7. 诗和远方:无题(四十五)
  8. 诗与远方:无题(三十)- 凄凉缘空
  9. 必备的Linux基础命令
  10. python编辑器和python解释器的区别_python编译器和解释器的区别