编程语言按照数据类型可以分为两类,一类是静态类型语言,另一类是动态类型语言。
静态类型语言又名为强类型语言,像是c,java,当你声明一个变量的时候,在编辑的时候,这个变量的类型就已经被确定了。而动态类型语言,只有这个变量被赋值之后,才会具有某种类型。只有在运行的时候,你才知道他是个什么类型。举一个简单的例子,javascript中的变量,往往类似于姜炒土豆丝,不到吃进嘴里的那一刻前,你永远不知道是姜丝还是土豆丝。
静态类型的语言在让人使用的时候总会有一种被强迫的感觉,这只是一种增强代码可靠性的手段。
而动态类型语言,由于无法保证数据的类型,所以在某些情况下,程序可能会变得难以理解。但是整体上,代码量更少,毕竟少了许多声明代码。
因为无需类型检测,所以,如果我们拥有一个对象,我们可以尝试对他调用任何方法,即使会报错。
为什么javascript的语言类型会被设计成这这种形式,这离不开javascript的独特判断理念。
在其他的语言中,两个变量再进行比较的时候,要先确定你们是不是同一类型的值,其次判断你们的值是否相等。
而javascript是一门随意的语言,他的判断理念是,只要你俩长得像,就相同。
这对于任何一名没有学过javascript的程序员来说,都是荒诞不羁的理念。这一点都不严谨。
是的,javascript就是这么随意,你奈我何?
这种判断理念被称之为鸭子理念,通俗解释来说,如果一个声明长得像鸭子,叫起来也像鸭子,行为也像鸭子,那他就可以当做鸭子。
一个对象,如果有push和pop方法,那么他就可以当作栈。一个对象,如果它是按照下标存值,那么他就是数组。
面向对象,一切服务于对象,一切服务于需求,顾客就是上帝,Javascript是一门真正的面向对象的语言。
有一只鸭子,有一只鸡,农场主需要鸭子叫的时候鸭子就叫,需要鸡叫的时候鸡就叫。这是类的设计思想。我规定好种类,每个种类负责干这个种类该干的事。
有一只鸭子,农场主需要鸭子叫的时候这只鸭子就学鸭子叫,需要鸡叫的时候这只鸭子就学鸡叫。听起来是不是非常的扯淡?那又如何,你需要鸡叫我叫了,你就说你听没听见鸡叫吧。你管我是个啥,王侯将相宁有种乎。
所以,如果你在之前深深地收到过类的理念影响的话,此时此刻,希望你可以忘记一切,我们从头开始,走进这门有趣的语言。走进真正的街溜子语言,javascript。
我们前言已经说到,顾客就是上帝,这个理念将会贯彻Javascript全身,也会贯穿我们整个系列。
就像,上一个例子,在javascript中,我们只需要创建一个鸭子叫的方法,当农场主需要鸭子叫的时候,如果我们身边没有鸭子,按照类的理念应该是先通过类创建一个鸭子,然后让鸭子叫,但是javascript的理念确是,随便来个什么东西,我把鸭子叫这个能力教给你,你叫就完事了。
是的,一切都是为了实现鸭子叫这个方法,到这里,我想你也明白了为什么javascript是一门函数化语言。javascript的世界以各种对象为主,函数像是一种委托,被从一个对象传递给下一个对象。
函数在对象和对象中传递的时候,不免要进行传递参数,但是由于我们的javascript的鸭子模式,导致在传递参数的时候无需先规定好我要传递的这个参数,是什么类型。这对于javascript工程师们,只有两个词可以形容。
解脱
但是,解脱带来的是混乱,下面这种场景,层出不穷。
“我找你借两千块钱,你给我半条毛裤是什么意思?”
大家不要笑,这在我们的世界中是习以为常的事情。你们如果笑了,会让作者觉得我们的世界很滑稽。
由于类的设计理念早已经深入人心,所以在早期的javascript工程师们,大家为了实现类的设计模式,使用了一种叫做原型链的东西。去伪造类。这无疑是对javascript自由象征的一种背叛。同时他们也成功地,让原型链这个javascript的核心机制,变得异常难以理解。
人们常常喜欢通过类去解释原型链,到后来,当大家认清了,这是一门面向对象的语言后,一些人脑子转过了弯,开始试图用克隆来形容原型链。
在我看来,都不对,原型链就是原型链,前端一直流传着一句古话,不要重复造轮子,如果这个东西和类一模一样。那么原型链就没有存在的意义。如果用现实世界相比,我觉得,原型链更像是意大利黑手党。
而Object.prototype,也不再是那个我们脑海中枯燥无味的对象原型,从今天起,我们有一个更好的名字用来描述他,那就是:
教父
下一篇:原型链?不!意大利黑手党!