《悟透javascript》这本书以一种通俗易懂的幽默形式,讲述了es6之前版本的js精髓,也是大众吐槽的部分,因为
js与很多语言很不一样,没有类,没有严格的类型,没有那么多界限,至有灵活的使用方式,有一种无论怎么编写代码
都不会出错的感觉,而这一份灵活给有语言其他语言基础的人很大困扰,所以前端经常被自己嫌弃,因为js的不严谨。
但我觉得这也是js简单之处。
而这本书一直围绕一个中心述说。以下为它故事形式阐述中心的故事:
在五祖弘忍讲授完《对象真经》之后的一天,他对众弟子们说: “经已讲完,想必尔等应该有所感悟,请各自写个偈子来看”。
大弟子神秀是被大家公认为悟性最高的师兄,他的偈子写道: “身是对象树,心如类般明。朝朝勤拂拭,莫让惹尘埃! ”。
此偈一出,立即引起师兄弟们的轰动,大家都说写得太好了。只有火头僧慧能看后,轻轻地叹了口气,又随手在墙上写道: “对象本无根,类型亦无形。本来无一物,何处惹尘埃? ”。
然后摇了摇头,扬长而去。大家看了慧能的偈子都说: “写的什么乱七八糟的啊,看不懂”。师父弘忍看了神秀的诗偈也点头称赞,再看慧能的诗偈之后默然摇头。
就在当天夜里,弘忍却悄悄把慧能叫到自己的禅房,将珍藏多年的软件真经传授于他,然后让他趁着月色连夜逃走...
后来,慧能果然不负师父厚望,在南方开创了禅宗另一个广阔的天空。而慧能当年带走的软件真经中就有一本是《JavaScript 真经》!
他可理解为:
理解 JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。 JavaScript 就是把数据和代码都简化到最原始的程度。
而我觉得里面述说的构造函数与原型很好,通俗易懂。
构造对象: function MyFunc() {}; //定义一个空函数 var anObj = new MyFunc(); //使用 new 操作符,借助 MyFun 函数,就创建了一个对象 等价于: function MyFunc(){}; var anObj = {}; //创建一个对象 MyFunc.call(anObj); //将 anObj 对象作为 this 指针调用 MyFunc 函数
原型: prototype 提供了一群同类对象共享属性和方法的机制. function Person(name) { this.name = name; //设置对象属性,每个对象各自一份属性数据 }; Person.prototype.SayHello = function() //给 Person 函数的 prototype 添加 SayHello 方法。 { alert("Hello, I'm " + this.name); } var BillGates = new Person("Bill Gates"); //创建 BillGates 对象 var SteveJobs = new Person("Steve Jobs"); //创建 SteveJobs 对象 BillGates.SayHello(); //通过 BillGates 对象直接调用到 SayHello 方法 SteveJobs.SayHello(); //通过 SteveJobs 对象直接调用到 SayHello 方法 alert(BillGates.SayHello == SteveJobs.SayHello); //因为两个对象是共享 prototype 的 SayHello,所以显示:true 而且原型的动态扩展性很棒。 var BillGates = new Person("Bill Gates"); //建立对象 BillGates.SayHello(); Person.prototype.Retire = function() //建立对象后再动态扩展原型的方法 { alert("Poor " + this.name + ", bye bye!"); }; BillGates.Retire(); //动态扩展的方法即可被先前建立的对象立即调用
组合模式继承:
原型链的访问方式和对象的覆盖性,可以实现层层向上访问自己的或父辈级以上的方法或属性,还有它的扩展功能。 继承,共享方法与私有属性。 function father() { this.a = 'father' } father.prototype.b = function() { alert(this.a) } var child = function() { father.call(this) } child.prototype = new father(); 因为自身的属性会覆盖原型的属性,所以原型属性无法访问, 而new的构造函数会被指派原型,然后被变量承接到,达到原型链的形成。 这样实现继承的效果。 对象间的方法是共享的,不会遇到垃圾回收问题,而且性能优于“闭包”模型。
js一切皆为对象,但函数是最特别的对象。