1、编程语言按数据类型可分为静态类型、动态类型语言
静态类型优点在编译时就能发现类型不匹配的错误,缺点迫使程序员依照强契约编写约定(代码良多,分散程序员在业务逻辑上的精力)
动态优点是代码数量更少,可以将更多精力放在逻辑上,缺点是无法保证变量类型
2、鸭子类型的思想
例如:一个对象有pop和push方法并且这些方法被正确的实现,就可以被当作栈来使用;
一个对象有length属性,也可以依照下标来存取属性(最好还有slice、splice等方法),这个对象就可以当作数组来使用
3、多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。
多态背后的思想是将“做什么”和“谁去做以及怎样做”分离开来,也就是将“不变的事”和“可能改变的食物”分离开来
多态的根本作用就是把过程化的条件分支语句转化为多态的对象行,从而消除这些条件分支语句。
利用对象的多态性,每个对象应该做什么,已经成为了该对象的一个方法,被安装在对象的内部,每个对象负责他们的行为。所以这些对象可以根据同一个消息,有条不紊的分别进行各自的工作。
4、封装的目的事信息隐藏,广义的封装不仅包括封装数据和封装实现,还包括封装类型和封装变化
①封装数据,js只能依赖变量的作用域来实现封装特性
②封装实现,封装不仅仅是隐藏数据,还包括隐藏实现细节、设计细节以及隐藏对象的类型等。
从封装实现细节讲,封装是的对象内部的变化对其他对象而言事不可见的,对象对它自己的行为负责。其他对象、用户不必关系其内部实现
③封装类型,(个人见解借助ts)
④封装变化
把系统中稳定不变的部分和容易变化的部分隔离开来,保证程序的稳定性和可拓展性
5、原型模式
原型模式通过克隆创建对象,如果需要一个与某个对象一模一样的对象,就可以使用原型对象
var Plane = function(){
this.blood = 100
}
var plane = new Plane()
plane.blood = 500
var clonePlane = Object.create(plane)
console.log(clonePlane.blood)//500
在不支持Object方法的浏览器中,则可以使用以下代码:
Object.create = Object.create || function (obj){
var F = function(){}
F.prototype = obj//基于原型链的委托机制就是原型继承的本质
return new F()
}
②原型编程的基本原则
所有的数据都是对象
要得到一个对象不是实例化类,而是找到一个对象作为原型并克隆它
对象会记住它的原型
对象无法相应某个请求,它会把这个请求委托给他的原型。
6、js的根对象是Objec.prototype,该对象是空对象。另外通过Object.create(null)可以创建出没有原型的对象
Array.prototype.slice.call(arguements)将类数组对象转为数组,(dom节点除外,因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换)
7、闭包
变量的作用域指变量的有效范围
变量的生存周期:全局变量是用具的;对局部变量,随着函数的退出而销毁
闭包的作用
①封装变量②延长局部变量的寿命
处理闭包的内存泄漏
①手动将变量设为null
删除闭包
|
外部无法访问到闭包里面的变量, 但可以在闭包内部返回一个方法, 该方法将闭包内部的变量设置为null, 让变量失去引用,会被系统自动回收。
实际上如果只是要把闭包内的一些变量给删除, 那么我觉得这样的程序设计是有问题的, 如果你的变量只需要用一次,就要删除,那么使用闭包来实现这样的方法显然是浪费。 如果闭包不需要了, 想删除闭包,直接 foo = null; 就可以了。