首先 面向对象特性 :封装继承多态,满足部分特性的语言称为“基于对象语言”。
这些统称为‘对象系统’,‘对象系统’的继承特性三种实现方案: 基于类 基于原型 基于元类。
在javascript中采用基于‘构造器’机制来实现类的一些功能。
javascript的优点也是它的缺点,对于大型对象系统,对 对象的封装和多态支持不够,对于小型系统,又由于‘动态,函数式,原型继承’的灵活性而带来混杂。
javascript的原型继承依赖 关联数组 和 函数式语言 两方面特性;另外原型重写与原型链维护还涉及到动态语言特性。
所以 ,尽管 原型 是一种简义的单的对象系统实现,但在javascript中,具有了双重含性质。
-------------函数式语言介绍 -------------------
函数是lambda 并非 function
函数式语言属于说明式语言,对应的是命令式语言
在计算机技术发展中,命令式语言 依赖并引导 冯.诺依曼体系的硬件系统(基于存储和运算)的产生。
除了被称为LISP机器的 硬件,没有其他的硬件系统在机器指令级别支持函数式语言 ,大多数人都在使用冯.诺依曼体系的命令式语言,
但为了获得特别的计算能力或者编程特性,这些语言也在逻辑层面来实现一种适宜于函数式语言范畴的环境,如javascript这样的多泛型语言和.net与jvm能够运行某些函数式运算的虚拟机环境;
所以函数式运算是一个图灵等价的运算系统;
函数式语言代码风格所表达的基本语言特性之一就是 连续运算。因此从理论来说,函数式语言不需要寄存器或变量赋值。
函数式语言中的‘函数’需要满足:
1,函数是运算元; (不像c那样函数作为指针,传递的是内存地址;JavaScript函数是普通的运算元)
2,在函数内保存数据; (在函数内保存数据的特性成为 闭包)
3,函数内的运算对函数外无副作用。
函数式语言的精髓并不是函数,而是运算,函数只是封装运算的一种手段;这里也提到的计算机的本质:运算!!!!!!
javascript并没有完全满足三特性,体现在 对循环逻辑的封装上。在‘尾递归’与‘利用多泛型特性来包含循环语句’这两个方案上,选择了后者。
并不是支持函数的语言就叫做函数式语言;并不是命令式语言中的function和procedure,也不是javascript中看到的function关键字或Function类型,
所以仅凭javascript中函数是第一型,推出javascript是函数式语言是不正确的。
函数是 lambda 并非 function;
函数式语言Scheme,编程模式:function[args].运算符和运算元。
要让javascript中的函数(function)能够替代运算符,并起到Scheme中函数的作用,前提就是让function可以作为运算元,也就是既可以作为参数在函数中
传入传出,也可以作为函数来执行调用;在函数式语言中叫做高阶函数;
(高阶函数:让函数作为运算元:函数既可以作为数据值存储与向函数传入传出,又可以作为函数来执行调用 )
------------动态语言介绍---------------------
语言包括‘语法’、'语义'、'语用',如果某种语用在语言陈述时无法确定而在执行时才能确定这三者之间的关系,我们称该语言是动态语言的。
如 javascript中代码: a+b ,不能确定是字符串连接还是数值求和。
JavaScript是完全动态的语言 | 在javascript中,存在 ‘标识符指称不确定’ 和 ‘上下文环境不确定’ 。
‘标识符指称不确定’表现在:动态类型,动态重写和动态存取的数据结构三方面。
‘上下文环境不确定’表现在:动态的变量/语法作用域。
JavaScript脚本语言:代表应用的依赖,而非语言的依赖。在一些解决方案中,也可以作为通用语言来实现系统。
强调脚本只是一种表现形式,‘脚本化’并非javascript这种语言的本质特征;
除去表面现象,JavaScript动态性表现:
1,解释而非编译;2,可以重写标识符(除关键字),以重新定义系统特性。
3,动态类型系统(JavaScript是弱类型,也是动态类型) 4,动态执行 eval() 5,丰富的数据外部表示;可序列化。
javascript由于动态执行导致不可编译;(真正的编译为二进制)
重写
javascript基于原型重写与原型修改构造继承系统;
由于引擎在语法分析期既不能对重写行为进行任何预期,也不能进行限制;因此会导致不可预料的代码逻辑错误;
因此,我们在使用javascript时,得到了‘足够的’ ,以及‘难以驾驭的’灵活性;
脚本加载的时序就会影响系统的一些重写特性;
包装类及一切都是对象
javascript中存在两套类型系统:
一是元类型系统(meta types) 由typeof运算符检测 undefined string boolean number function object
二是对新类型系统。object的分支 String,Number......
在javascript中,除了undefined外,其他一切都是‘对象’;
对于元数据:普通的求值/赋值运算,它还是以‘非对象’形式存在;在对元数据进行对象系统的方法调用(属性赋值、调用方法等)时,会自动进行包装,要注意包装对象并不等同于原来的对象;
因此,元数据的方法调用其实是被临时地隔离在另外的一个对象中完成的;所以无论如何修改这个临时的包装对象,都不会影响原来的元数据值。
javascript 统一函数式语言与面向对象编程(命令式语言范型)的核心思想,一方面表现为‘一切都是对象’,另一方面表现为‘函数是第一型’ 。
JavaScript数组:关联数组(动态数组) 类似map
索引数组:以序数类型作为下标,按序存取元素的数组。 连续内存分配。
关联数组:以非序数类型作为下标变量来存取的数组。 指针形式存储。
JavaScript中数组下标必须为值类型(非值类型被转换为字符串),
JavaScript中值类型:number、boolean、string。(只有boolean是序数。number在JavaScript中实现为浮点数)
因此JavaScript必然以关联数组为基础,JavaScript中的‘索引数组’只是用数字的形式来存取一个关联数组。
实际上,在Array类型前,系统已经为Object类型实现好了关联数组特性。对象(的原型)所持有的属性表,就是一个关联数组的内存表达。
运算的实质:值运算。
引用类型的价值:1,标识一组值数据;2,提供一组存取值数据的规则;3,在函数中传递与存储引用