《JavaScript高级程序设计 第二版》理解对象

声明:这类属于学习笔记,主要是摘录书中内容,比较少的整理。内容经常是跳跃的,建议您阅读书本,收益更大。



ECMA-262把对象定义为“无序属性的集合,其属性可以包含基本值,对象或者函数”

对象时一组没有特定顺序的值,每个属性或方法都有一个名字,每个名字都映射一个值。

每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章讨论的原生类型,也可以是开发人员定义的类型

常规的创建对象的方法是通过Object这个内置对象来进行创建出一个实例,然后再給其添加属性和方法

var person=new Object();
person.name="nico";
person.age=22;

person.sayName=function(){
     alert(this.name)
}

后来大家逐渐使用对象字面量来创建对象

var person={
    name:"nico",
    age:22,

    sayname:function(){
         alert(this.name)
    }
};

属性

在ECMA-262第五版定义  只有内部才用的特性时,描述了属性的各种特征。

ECMA-262定义这些特性是为了JavaScript引擎用的,因此在JavaScript中不能直接访问他们。

为了表示是内部值,该规范将他们放在了两对方括号中例如 [[Enumerable]]

数据属性:包含一个数据值得位置,在这个为之可以读取和写入值,有4个可以描述其行为的特性

  • [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特征性,可以在对象上直接定义的属性,或者将其修改为访问器属性,默认为true
  • [[Enumerable]]:能否通过for-in循环返回属性,可以在对象上直接定义的属性,默认true
  • [[Writable]]:表示能否修改属性的值,可以在对象上直接定义的属性,默认true
  • [[Value]]:包含这个属性的数据值。读取属性的时候,从这个位置读,写入属性的时候,在这个为之写,默认是undefined。

如果没有对这些特性值制定,那么会是默认的。有一点,要修改这些,必须调用Object.defineProperty()方法,接受三个参数

  • 属性所在的对象
  • 属性的名字
  • 描述符对象(必须是上面介绍的4个中1~4个)

如下

var person={ };
Object.defineProperty(person,"name", {
    writable:false,
    value:"kobe"
});

console.log(person.name); //kobe
person.name="mike";
console.log(person.name); //kobe

然后这里要注意,如果修改了Configurable设置了false,那么以后这个对象的这个属性就不能改改回来了,会发生错误。除了writable可以改以外。而且当不指定的之后,这些值会从默认的true变为false。好在我们多数情况是没有必要使用这些属性的。

访问器属性

不包括数据值:他们包含一堆getter和setter函数(这两个函数不是必须的)。读取访问器属性时,调用getter,写入时会调用setter。

  • [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特征性,可以在对象上直接定义的属性,或者将其修改为访问器属性,默认为true
  • [[Enumerable]]:能否通过for-in循环返回属性,可以在对象上直接定义的属性,默认true
  • [[Get]]:在读取时候调用的函数。默认是undefined
  • [[Set]]:在写入时候调用的函数,默认是undefined

同样的也是不能直接访问,必须通过和上面一样的函数来访问

var book={
    _year:2004,
    edition:1
};

Object.defineProperty(book, "year", {
    get:function(){
        return this._year;
    },

    set:function(newValue){
        if (newValue>2004) {
            this._year=newValue;
            this.edition += newValue-2004;
        }
    }
});

book.year=2006;
console.log(book.edition); //3

你可以不同时指定,如果另一个没有指定,则意味着不可用。例如只制定了setter,表示不可读;反之

在此之前,访问器属性使用的是_defineGetter_ 和 _defineSetter_,前面的Object换成具体对象,如book._defineGetter_(),2个参数,省去了前面的第一个参数

定义多个属性 Object.defineProperties(),接受2个对象参数,第一个参数是要添加和修改属性的对象,第二个与第一个对象中药添加或修改的一一对应

读取属性的特性:Object.getOwnPropertyDescriptor();接受2个参数,属性所在的对象,和要读取的属性名,返回的是一个对象

时间: 2024-12-19 21:06:38

《JavaScript高级程序设计 第二版》理解对象的相关文章

Javascript高级程序设计——第二章:在HTML中使用Javascript

第二章:在HTML中使用Javascript <script>元素 向HTML页面中插入Javascript的主要方法,就是使用<script>元素,<script>元素有六个属性: async:可选.表示应该立即下载脚本,但不妨碍页面的其他操作,比如下载其他资源或等待加载其他脚本,只针对外部脚本有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只针对外部脚本有效. src:可选.表示包含要执行代码的外部文件. type:可选.表示编写代码使用

读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript

1 <script>的6个属性 async  立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer  文档显示之后再执行脚本,只对外部脚本有效 language 没用了 src type 描述代码内容Mine类型 默认就是text/javascript 没什么用 2 在解释器对<script>元素内部的所有代码求值完毕以前 页面中的其余内容都不会被浏览器加载或显示 3 有两种script 嵌入式 外部引入式 在解析外部引入式的js文件时,页面的

javascript高级程序设计---第二、三章

在HTML中引用javaScript javascript的几个属性  type async(异步加载 只适用于外部JS且IE8以上 HTML5规范 先于load执行) src defer(延迟加载 只适用于外部加载 先于load执行) 在HTML中使用外部JS代码的优点,1.便于维护 ,2.可缓存.3.适应未来. 在javascript中区分变量的大小写 比如(test 和 Text是?的两个变量) 在ECMA5中新模式,严格模式  'use strict'在js代码中加入这句话即为严格模式

《JavaScript高级程序设计》(第二版)

这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量,他出的书都广受好评.这本书已经出了第二版,而且与第一版相比内 容更新很大,直接第二版就行.不要被书名的“高级”唬住,只要有JS基础语法知识和DOM基础知识就行,而且本书开始阶段还是介绍JS和DOM的语法知 识. 评论:重点推荐一下第五章(类型),第六章(OOP),第七章(匿名),多看几遍,至少要完全

JavaScript高级程序设计(第三版)学习笔记20、21、23章

第20章,JSON JSON(JavaScript Object Notation,JavaScript对象表示法),是JavaScript的一个严格的子集. JSON可表示一下三种类型值: 简单值:字符串,数值,布尔值,null,不支持js特殊值:undefined 对象:一组无序的键值对 数组:一组有序的值的列表 不支持变量,函数或对象实例 注:JSON的字符串必须使用双引号,这是与JavaScript字符串最大的区别 对象 { "name":"Nicholas"

JavaScript高级程序设计(第3版) 中文pdf扫描版 89M 高清下载

<JavaScript高级程序设计(第3版)>是JavaScript超级畅销书的最新版.ECMAScript5和HTML5在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为JavaScript增添了很多适应未来发展的新特性. <JavaScript高级程序设计>这一版除增加5章全新内容外,其他章节也有较大幅度的增补和修订,新内容篇幅约占三分之一. 全书从JavaScript语言实现的各个组成部分——语言核心.DOM.BOM.事件模型讲起,深入浅出地探讨了面向对象

JavaScript高级程序设计(第三版)学习,第一次总结

Array类型 var arr = []; arr.length; //返回数组元素个数 改变length可以动态改变数组大小 检测数组 instanceof可以检测某个对象是否是数组,限制:只能是一个网页或一个全局作用域 Array.isArray(arr); //最终确定某个值到底是不是数组,没有限制 转换方法 arr.toString(); //返回由数组每个值的字符串形式拼接而成的以逗号分隔的字符串 arr.valueOf(); //与toString方法一致 arr.toLocalSt

《JavaScript高级程序设计第五章--引用类型》之Object对象和array对象

这一章主要就是介绍各种内置对象的用法,认识其经常用到的属性和方法. 5.1Object类型 创建objec的方式,一种是new Object(),一种是对象字面量(简化创建包含大量属性的对象的过程) var person = { name = "Nicholas"; age = 27 };//最后一个属性不必添加逗号,ie7等会导致错误 //在使用对象字面量语法时,属性名也可以使用字符串.这里的数值属性会自动转字符串. var person = { "name" :

《javascript高级程序设计》第二、三章知识点整理

第二章知识点总结 1.<script>在html中的使用 主要功能:在页面中嵌入javascript代码或包含外部javascript文件. 常用属性: type:用于定义脚步代码的语言类型,默认为text/javascript. src:包含外部域的javascript文件. defer:表示脚本会在整个页面加载完毕之后运行,只对外部文件有效,最好只包含一个延迟脚本. async:脚本在不妨碍其他操作的情况下立即下载(不保证下载文件的顺序). 插入位置:在页面<body>标签页面