JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScri(2)

  在我们捣鼓 JavaScript 的过程中,工具是非常重要的。我这里介绍的第一个工具就是 Chromium 浏览器中自带的 JavaScript 控制台。在 Ubuntu 中安装 Chromium 浏览器只需要一个命令就可以搞定,如下:

sudo apt-get install chromium

  启动 Chromium 浏览器后,只需要按 F12 就可以调出 JavaScript 控制台。当然,在菜单中找出来也可以。下面,让我把上面的示例代码输入到 JavaScript 控制台中,一是可以看看我们写的代码是否有语法错误,二是可以看看 JavaScript 对象的真面目。如下图:

JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScri

  对于广大的前端攻城狮来讲,Chromium 的 JavaScript 控制台已经是一个烂大街的工具了,在控制台中写console.log("Hello, World!");就像是在 C 语言中写printf("Hello, World!");一样成为了入门标配。在控制台中输入 JavaScript 语句后,一按 Enter 该行代码就立即执行,如果要输入多行代码怎么办呢?一个办法就是按 Shift+Enter 进行换行,另外一个办法就是在别的编辑器中写好然后复制粘贴。不过在 Chromium 的 JavaScript 控制台中还有一些不那么广泛流传的小技巧,比如使用console.dir()函数输出 JavaScript 对象的内部结构,如下图:

JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScri

  从图中,可以很容易看出每一个对象的属性、方法和原型链。

  和其它的面向对象编程语言不同, JavaScript 不是基于类的代码复用体系,它选择了一种很奇特的基于原型的代码复用机制。通俗点说,如果你想创建很多对象,而这些对象有某些相同的属性和行为,你为每一个对象编写单独的代码肯定是不合算的。在其它的面向对象编程语言中,你可以先设计一个类,然后再以这个类为模板来创建对象。我这里称这种方式为经典的面向对象体系。而在 JavaScript 中,解决这个问题的方式是把一个对象作为另外一个对象的原型,拥有相同原型的对象自然拥有了相同的属性和行为。对象拥有原型,原型又有原型的原型,最终构成一个原型链。在现代 JavaScript 模式中,硬是用函数、闭包和原型链模拟了经典的面向对象体系。

  原型这个概念本身并不复杂,复杂的是 JavaScript 中的隐式原型和函数对象。什么是隐式原型,就是说在 JavaScript 中不管你以什么方式创建一个对象,它都会自动给你生成一个原型对象,我们的对象中,有一个隐藏的__proto__属性,它指向这个自动生成的原型对象;并且在 JavaScript 中不管你以什么方式创建一个对象,它最终都是从构造函数生成的,以对象字面量构造的对象也有构造函数,它们分别是Object()和Array(),每一个构造函数都有一个自动生成的prototype属性,它也指向那个自动生成的原型对象。而且在 JavaScript 中一切都是对象,构造函数也不例外,所以构造函数既有prototype属性,又有__proto__属性。再而且,自动生成的原型对象也是对象,所以它也应该有自己的原型对象。你看,说起来都这么拗口,理解就更加不容易了,更何况 JavaScript 中还内置了Object()、Array()、String()、Number()、Boolean()、Function()这一系列的构造函数。看来不画个图是真的理不顺了。下面我们来抽丝剥茧。

  先考察空对象someThing,哪怕它是以对象字面量的方式创建的,它也是从构造函数Object()构造出来的。这时,JavaScript 会自动创建一个原型对象,我们称这个原型对象为Object.prototype,构造函数Object()的prototype属性指向这个对象,对象someThing的__proto__属性也指向这个对象。也就是说,构造函数Object()的prototype属性和对象someThing的__proto__属性指向的是同一个原型对象。而且,这个原型对象中有一个constructor属性,它又指回了构造函数Object(),这样形成了一个环形的连接。如下图:

JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScri

  要注意的是,这个图中所显示的关系是对象刚创建出来的时候的情况,这些属性的指向都是可以随意修改的,改了就不是这个样子了。下面在 JavaScript 控制台中验证一下上图中的关系:

JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScri

  请注意,构造函数Object()的prototype属性和__proto__属性是不同的,只有函数对象才同时具有这两个属性,普通对象只有__proto__属性,而且这个__proto__属性是隐藏属性,不是每个浏览器都允许访问的,比如 IE 浏览器。下面,我们来看看 IE 浏览器的开发者工具:

JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScri

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ce59ef5e3e85bb792a03ae7d8a5137b3.html