JavaScript权威指南阅读笔记3

第六章 对象

1.首先是先介绍了对象直接量的格式:对象直接量就是1.由若干个名/值对组成的映射表,2名/值对中间由冒号分割,3名值对之间由逗号分割,4整个映射表由花括号括起来。这样就组成了一个对象直接量了。属性名可是是标识符或者字符串直接量,属性值可以使任意形式的JS表达式,表达式的值就是属性的值。就是平常所接触的对象的形式,比如:

  var a= { a:111,b:222}

  作者还举了一个需要特别注意的知识的例子:

 

var b = {
      "main title" : "aaa",     //属性的名字里有空格,所以必须用字符串表示
       "sub-title":"bbb",   //属性名字有连字符,必须用字符串表示
       "for":"ccc",//"for"是系统保留字,所以必须用引号
       author:{
       firstname:"dava",
       lastname:"aaa"
    }
}    

2.  构建一个新对象的时候可以new一个,

  var a = new Object();   var b = new Array();  var c = new Date();

  其中Object()、Array()等都是构造函数

3. 另外还可以通过Object.creat()方法新建一个对象,例如:

  var d = object.creat(e)  //e为D的原型.

  关于对象的原型的这个概念跟Java里父类的概念有些相似,具体的介绍可以查看一下下面这篇博文:

  原型对象和原型类:

  http://www.cnblogs.com/xqhppt/archive/2012/02/01/2334355.html

  当以e为原型创建一个对象d的时候,d{c:"ccc"}就继承了e的属性,比如说e为{a:"aaa",b:"bbb"}:d.c叫做d的"自有属性",同时d也会有d.a和d.b这两个属性,只不过这两个属性会显示为继承自原型的属性,但是他们是属于d的属性,当你使用d.a和d.b的时候,js会在d的属性中查找,当js在d中没有找到a和b属性的时候,js就会在它的原型e中查找,在e中找到了a和b之后,js会给对象d创造两个d.a和d.b属性,并对这两个值进行操作,但是不会对原型对象e产生任何影响.

4.  关于访问对象的属性有两种方法,一种是像Java一样通过.进行访问,点的右方必须是一个一属性名称命名的简单标识符如  book.author,book.name等,另一种方法是通过方括号来访问,方括号内必须是一个计算结果为字符串或者计算结果能转换成字符串的表达式,这个字符串也就是属性的名字,比如book["main title"]

  object.property与object["property"]意义是一样的.

  按照习惯都使用.的方式来操作对象的属性,当我们不知道对象属性的名字的时候,我们通过方括号的方式来操作属性或者获取属性的名字,例如:

  

 for(stock in portfolio){
       var shares =protfolio[stock];
    }

  这样我们就可以通过方括号的方式来便利一个对象里所有属性的值了,即便是我们不知道属性的名字.

5.在访问对象的时候并不总是成功返回值或者设置属性值,比如:当你访问一个对象的并不存在的属性的时候,会得到一个undifined的返回值;当你访问一个并不存在的对象的时候则JS就会报错,作者提供给了我们两端避免访问的错误而导致程序报错的方法:

  

假设不知道是否存在book和book.title,但是我们想获取book.title的length
则:
1.
var leng= undifined
if(book){
    if(book.title){
        leng=book.title.length;
    }
}
2
var leng = book&&book.title&&book.title.length

  对null和undifined进行属性赋值,也会包类型错误,

  另外还有其他的无法正常赋值的情况:

   a.如果o中的p属性是只读的,则不能给p进行赋值

  b.如果o中的p属性是继承而来的,但是也只读的,则也不能进行覆盖

  c.如果o中不存在属性p,也不存在继承自p的setter,且p是不可拓展的,则不能添加新属性p.

6.可以通过delete删除对象的一个属性,比如:delete book.title,delete book["main title"],但是delete删除的属性和宿主对象的联系(作者在这里举了一个例子来解释这句话:a={p:{x:1}}),b=a.p,delete a.p.这是 b.x的值仍然是1,也就是说delete仅仅珊瑚了a与属性p之间的联系,并没有想象到b跟p的联系)

  delete只能删除对象的自由属性,并不能操作继承自原型的属性.如果delete了原型的一个属性,那么也会影响到每一个继承自这个原型的对象.

  delete不能删除一个对象的可配置性为flase的属性.

  在非严格模式下,删除全局对象的可配置属性的时候可以省略对全局对象的引用,如:

  this.x=1;

  deleete x;

  但是在严格模式下,删除全局对象的可配置属性必须加上对全局对象的引用

  this.x =1

  delete this.x;

7.JS的对象可以看做是属性的集合.我们需要检测对象是否存在某条属性的时候,可以用in,hasOwnProperty()和 propertyIsEnumerable()方法.

  in判断对象是否存在这条属性,比如:

  var a ={x:1}

  "x" in a; //true

  hasOwnProperty()判断属性是否是对象的自有属性,通过集成得到的属性则会返回false

  如: o.hasOwnProperty("x")//true  o.hasOwnProperty("toString")  //false

8.属性具有可枚举性,当属性的可枚举性为true的时候,可以通过for/in循环便利到这个属性,如果可枚举性为flase,怎不可以,如:

var o={x:1,y:2,z:3};
o.propertIsEnumable("toString") //错误,不可枚举
for( i in o){
    console.log("i") //输出x/y/z
}

  ECMAScript 5提供了两个可以获取枚举属性名称的函数:

  1:Object.key();他会返回一个由对象的可枚举的自有属性的名称组成的数组

  2:Object.getOwnProperty():他返回的是一个有对象所有自有属性的名称组成的数组,包括可枚举的和不可枚举的.

9.JS提供一个特殊的存储器属性,它不同于"数据属性","数据属性"只是一个简单的值,"存储器属性‘,则由一个或者两个方法组成,两个方法是getter和setter,例如:

var p ={
     x:1,
     y:2,
     get r{return math.sqrt(this.x*this.x+this.y*this.y);},
     set r(newvalue){
          var oldvalue = math.sqrt(this.x*this.x+this.y*this.y)
          var ratio = newvalue/oldvalue
          this.x*=ratio
          this.y*=ratio
     }
}

当我们调用p.r属性的时候

console.log(p.r)//调用get r方法
p.r=5//调用set r方法

10.

属性具有四个特性:对于"数据属性"来说,分别是值,可写行,可枚举性,可配置性.对于"存储器属性"来说,分别是读取(get),写入(set),可枚举性,可配置性

时间: 2024-11-05 01:59:08

JavaScript权威指南阅读笔记3的相关文章

JavaScript权威指南学习笔记之一

1.关于分号 javascript里面不强制使用分号来表示一行语句的结束,但是最好能够在写js之前,特别是在原有的js上面新增时,最好前置一个分号.避免这种情况发生:  2.JavaScript类型转换 3.关于=== ①如果类型不同则不等 ②null===null或undefined===undefined ③true===true或false===false ④NaN不等 ⑤0===0 0===-0 ⑥如果是同一个object,array,function则相等 4.关于== ①如果已经==

javascript权威指南-数据类型笔记

原始值与应用值 1.原始值类型数据室不可变的 (改变原始值类型数据, 返回的是一个新的对象) var str0 = 'test'; var str1 = str.replace('t', 'a'); alert(str1); // 输出 'aest' alert(str0); // 输出 'test' 2.应用值类型是可变的(他的值是可以修改的) // 对象直接量 var o = {x:1, y:2, z:3}; console.log(o); // 输出 Object { x=1, y=2,

JavaScript权威指南读书笔记【第一章】

第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自Java 一等函数来自Scheme 基于原型的继承来自于Self 名字和版本: JavaScript是由网景(Netscape)公司创建,“JavaScript”是Sun MicroSystem公司的注册商标,用来特指网景(Mozilla)对着门的实现. ECMAScript: 网景将这么语言作为标准

javascript权威指南学习笔记1

打开这本书,进入到javascript的世界.以前都是看各种视频,感觉什么收获也没有,反而弄得脑袋混乱,希望能够按照这本书的节奏掌握javascript这门语言,为我的前端学习打下基础. 学习前准备:web浏览器(F12用来唤醒和关闭firebug界面,ctrl+shift+j用来唤醒错误工作台,console.log()调试辅助) 本书分为4个部分:Javascript语言核心:客户端Javascript:Javascript核心参考:客户端Javascript参考.今天主要学了第一部分.主要

javascript权威指南学习笔记2

Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相等,包括自身.if(x!=x) return NAN:==>isNaN()判断是不是NaN或者字符串等 javascript的精度要注意,即(0.3-0.2)!=(0.2-0.1) Date()构造函数:月份从0开始计数,天数从1开始计数,星期天是0: 2.文本: 转义字符(牢记斜杠后面几个特殊的值

javascript 权威指南学习笔记

//通过id查找多个元素 function getElements(/*ids...*/){ var elements = {}: for(var i=0; i<arguments.length; i++){ var id = arguments[i]; var elt =document.getElementById("id"); if(elt == null) throw new Error("No element with id :" +id); ele

css权威指南阅读笔记-第三章声明的层级

有时候对同一个目标元素,选择器有多种不同的写法.具体哪种声明会生效,主要看层叠关系 层叠关系主要看三层,分别是特殊性,权重和顺序. 1.特殊性 选择器有各自的特殊性. 内联样式为1000,id选择器为100,class选择器和属性选择器为10,各个元素为1,通配选择器为0(0比没有大,继承的特殊性就是没有,所以有继承和通配同时出现,采用通配选择器).如 h1.box这个选择器的特殊性就是1+10=11. 当声明中有!important的时候,那么它的特殊性超过了内联样式. 继承的属性没有特殊性,

css权威指南阅读笔记-第二章css选择器

css选择器有10+种.这里介绍几种常用的和他们的特点 1.元素选择器 如h1 h2 h3 a p 等一系列标签名 2 通配选择器 *,匹配所有html的元素 3 类选择器 class=‘a b'这种选择器在.a.b和.b.a是一样的,不区别先后顺序,另外类选择器区分大小写,class='A'在css中不能用.a匹配到,只能用.A匹配到 类选择器在页面中一般用于样式的复用 4 ID选择器 id选择器在页面中具有唯一性,并区分大小写,就是说box和BOX不是同一个ID 5 属性选择器 有4种模式

html5+css3 权威指南阅读笔记(三)---表单及其他新增和改良元素

一.新增元素及属性 1.表单内元素的form属性. html5: <form id="testForm"> <input type=text> </form> <textarea form = testForm></textarea> 2.表单内元素的formaction属性 <form id="testForm" action="test.jsp"> <input t