悟透javascript

《悟透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一切皆为对象,但函数是最特别的对象。

原文地址:https://www.cnblogs.com/zx192664369/p/8572130.html