《精通JavaScript》书评

当前位置:首页 > 网络编程 > 编程语言与程序设计 > 精通JavaScript

出版社:人民邮电出版社
出版日期:2008-4-1
ISBN:9787115175403
作者:John Resig
页数:289页

JavaScript登堂入室之作

学习JavaScript不久,很多JavaScript的核心概念都不怎么了解,对JacaScript的认知基本都是从W3C上面学到的,多是一些基本的语法。然后从图书馆借来JavaScript基础来看了下,很多内容都是懂得,于是自以为JavaScript的内容大致都已经了解了,只待应用了。看了这本书,才知道以前懂的只是皮毛,JavaScirpt的语言特性如闭包、引用等一概不知!现在就简单的谈谈自己学习这本书的收获吧(其实大部分是笔记而已)。1.JavaScript的语言特性1.1)引用(reference):是一个指向实际对象的指针,对象包含的一系列属性只是其他对象的引用。需要注意的几点:(a)引用指向的只能是具体的对象,而不是另外一个引用,即单层引用。(b)若修改引用指向的对象,则指向该对象的所有其他引用也跟着改变;若该对象被置为新的对象,原来指向该对象的引用仍然保持指向旧的对象。如:var a = "test"; //将a置为一个新的字符串对象var aRef = a; //aRef作为a的引用a+="ing"; //创建一个新的字符串对象alert(a != aRef); //a和aRef的值不相等1.2)函数重载和类型检测函数重载的判断根据:参数个数和参数类型。参数个数可以根据arguments得到,参数类型可以根据typeof或者constructor判断(当变量类型为Obeject或者Array时,不能用typeof判断)。1.3)作用域在JavaScript中,作用域是由函数划分的,函数内部为局部变量,函数外边为全局变量,而所有属于全局作用域的变量都是window对象的property。但是如果变量没有显示定义,就算在函数内定义的,它也是全局变量。如:function test(){f = "test"; }test(); //调用test来设置f的值alert( window.f == "test"); //f现在在全局作用域下1.4)闭包闭包即内层的函数可以引用存在于包含它的函数内的变量。闭包能简化代码,让代码清晰。应用之一是函数的curry化。此不赘述。1.5)上下文对象--this2.对象Object对象有如下属性:(i)constructor:对创建对象的函数的引用(指针)。对于 Object 对象,该指针指向原始的 Object() 函数。(ii)prototype(原型):对该对象的对象原型的引用。对于所有的对象,它默认返回 Object 对象的一个实例。所有对象原型的属性都能在该变量的每个实例中找到。给对象添加方法:(i)public method:使用prototype属性,这个属性可以作为所有新副本的基引用(base reference)。故public method都在prototype里添加。(ii)private method:定义一些只让对象内部访问,而外部访问不到的代码。可参考Private Members in JavaScript一文。(iii)privileged method:通过public method访问private method里面的变量和方法。(iv)static method:不能用该对象的实例来访问,而只能用该对象本身访问。类似Java中的静态方法。——————————————————————————————代码示范:function Test(string){ //创建一个Test构造函数this.s = string; }Test.staticMethodShow = function(){alert("this is static method show!"); }Test.prototype.show = function(){alert("public method show:"+this.s); }Test.staticMethodShow(); //this is static method show!var t = new Test("bbb");t.show(); //public method show:bbb}——————————————————————————————可以看到,static method与public method的区别——是否使用prototype属性。btw:通常我们使用function的prototype属性来创建对象的方法,而用普通方式来创建对象的属性。3.创建可重用代码3.1)JavaScript对象的创建与继承使用prototypal inheritance。这种方法的原理是对象的构造函数可以从其他对象中继承方法,原型对象创建后,所有其他的新对象都可以基于这个原型对象来构建。这种继承适用于单继承。——————————————————————————————function Person(name){this.name = name; }Person.prototype.getName = function(){return this.name; }function User(name, password){this.name = name;this.password = password; }User.prototype = new Person(); //User继承Person对象的方法User.prototype.getPassword = function(){return this.password; }var user = new User("aaa", "bbb");alert("name:"+user.getName()+" password:"+user.getPassword());分析:User.prototype = new Person(); User是对User构造函数的引用。new Person()用Person的构造函数创建了新的Person对象,然后把User构造函数的原型置为这个操作的结果。——————————————————————————————3.2)命名空间:var YAH00 = {}; //创建一个默认的、全局的命名空间YAHOO.util = {}; //使用对象设置一些子命名空间YAHOO.util.Event = { //创建最终命名空间addEventListener:function(){……}};YAHOO.util.Event.addEventListener{……}; //调用某个具体命名空间中的函数使用好命名空间,我们可以创建一个插件架构。可参考Dojo、YUI等。4.DOM这里简单说下DOM。有2种遍历DOM的方法:使用节点的parentNode,firstChild及nextSibling属性;使用getElementById()方法和getElementsByTagName()方法。获取元素内的文本:innerText或者nodeValue获取元素内的HTML:innerHTML。其中DOM的增删改此不赘述。5.事件5.1)JavaScript事件模型是异步事件模型,不是线程模型。对事件的处理分为两个阶段:捕获和冒泡。——————————————————————————————<body><ul><li>Home</li><li>About</li></ul></body>onload = function(){var li = document.getElementsByTagName("li");for(var i = 0; i<li.length; i++){li[i].onmouseover = function(){this.style.backgroundColor = 'green'; };li[i].onmouseout = function(){this.style.backgroundColor = 'red'; };}}分析:事件的执行顺序:当用户点击<a>元素,document的点击处理函数先发生,然后是<body>的处理函数,然后是<ul>、<li>的处理函数,一直到<a>元素,这是事件的捕获阶段。一但完成,再以<li><ul><body>和doument的事件处理函数顺序触发,这是事件的冒泡阶段。JavaScript代码中,我们要注意每次鼠标悬停在<li>上时都会选中2个元素:<li>和它包含的<a>。而这种传统的事件绑定方法只支持冒泡,不支持捕获。即使代码中<a>元素添加了事件监听,事件仍会冒泡到其父元素<li>中的处理函数去,然后继续上升DOM树,直至DOM中所有相应事件处理完为止。那么,怎样才能阻止事件冒泡呢?——————————————————————————————5.2)取消事件冒泡function stopBubble(e){if(e && e.stopPropagation){ //W3C方式e.stopPropagation();}else{ //IE方式window.event.cancelBubble = true;}}5.3)事件绑定监听函数:根据捕获和冒泡时处理事件的不同可分为捕获型事件和冒泡型事件。1.传统绑定:即传统的事件处理函数。但传统绑定只会在事件冒泡中运行,而非捕获和冒泡都能运行;其次一个元素一次只能绑定一个事件处理函数,在使用window.onload时,可能出现意想不到的结果。2.W3C绑定:document.body.addEventListener('keypress', myKeyPressHandler, false); //为文档的<body>绑定键盘点击事件处理函数window.addEventListener('load', function(){……}, false); //为页面绑定一个载入事件处理函数优点:同时支持事件处理的捕获和冒泡阶段:false(冒泡),true(捕获);this关键字引用当前元素;可以绑定多个事件。缺点:IE不支持。3.IE绑定:document.body.attachEvent('onkeypress' ,myKeyPressHandler);window.attachEvent('load', function(){……});优点: 可以绑定多个事件。缺点: 不支持事件捕获;仅IE支持。此书剩余部分基本讲解了JavaScript的应用,这里就不说了。顺便吐槽一句:看专业书还是看原版的好,翻译什么的还是少看吧!

似有jQuery源码分析的感觉

这本书英文名是Pro JavaScript Techniques。是jQuery之父John Resig所写的。书中的内容确实比较高级些,并非如犀牛书般的基础参考而已。这本书看下来的感觉就是:果然是JQ之父写的!为什么这样说呢,因为这本书可以说是JQ的源码解读。这里的很多篇幅都可以看做JQ的一些方法的原型实现。包括选择器,attr,insert,append,remove等,还有event注册等方法。如果你想要体会JQ是如何炼成的,看这本书是最好不过的了,对于你对JS的理解会上一个层次,了解JQ编写的原理,体会到大师的想法。当然看了这个之后自然就看到了比大师更大师的,Dean Edwards(http://dean.edwards.name/),这个牛人就是著名的JS压缩利器parker的作者。他写的cssQuery可以说是jQuery的最初的想法。但我们的John Resig很快发现光是选择器,比不过cssQuery,但是封装更丰富的操作那是很好很美妙的事情。同时,这本书也介绍了一些未来的javascript 1.6/1.7.这些已经部分的在Firefox中实现了。有兴趣的可以参考这里(http://developer.mozilla.org/en/docs/JavaScript_Language_Resources)。文中另外的一些连接已经失效了取而代之找到了如下页面,这里还有1.8的特新(大部分中文):  http://developer.mozilla.org/cn/docs/New_in_JavaScript_1.6  http://developer.mozilla.org/cn/docs/New_in_JavaScript_1.7  http://developer.mozilla.org/cn/docs/New_in_JavaScript_1.8

文笔略差

所谓文笔,并不是前阵子韩寒评论巴金冰心等人的“文笔”,只是说作者在讲解知识,分析问题的时候,不够流畅清晰。当然,这是相对于《ppk谈javascript》这本书而言的。我是读完ppk的书再买了这一本,因为前者说是初级的,后者是高级的。但是感觉,读完ppk的书,收获更多些。而Resig这一本,前几章的内容我大多都有所了解的了。可能我与众不同吧。后面几章,据说代码过多而分析太少,但我还没看到。就前面几章而言,代码占的比重也比较大。另外,如果对jquery比较熟悉的话,对书中的示例代码的功能会有一种心领神会的感觉。代码的构思很精巧,但是,有一些代码是有错误的。ps: John Resig的博客(http://ejohn.org/)我是必读的,有很多非常好的文章。

值得一读的好书

这本书的知识范围广泛,从这本书知道了很多之前不知道的事情,如JS中的编码规范,单元测试,打包发布等。值得一看。


 精通JavaScript下载


 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024