闭包
闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个
代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变
量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被
包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量
提供绑定的计算环境(作用域)。
性质
cl(S) 是 S 的闭父集。
cl(S) 是所有包含 S 的闭集的交集。
cl(S) 是包含 S 的最小的闭集。
集合 S 是闭集,当且仅当 S = cl(S)。
若 S 是 T 的子集,则 cl(S) 是 cl(T) 的子集。
若 A 是闭集,则 A 包含 S 当且仅当 A 包含 cl(S)。
有时候,上述第二或第三条性质会被作为拓扑闭包的定义。
在第一可数空间(如度量空间)中,cl(S) 是所有点的收敛数列的所有极限。
什么是闭包
“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的
环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript
中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定
义是非常困难的。
代码
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c();
特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
原型
原型是指原来的类型或模型,特指文学艺术作品中塑造人物形象所依据的现实生活
中的人。
原型是指一个词语或一个类型意义的所有典型模型或原形象,是一个类型的组典型
特征。
原型具有归纳性。
原型具有经验性
原型具有规约性
原型具有动态必。
原型链
1 // _proto_
2 在函数里有一个属性prototype
3 由该函数创建的对象默认会连接到该属性上
4 //prototype 与 _proto_ 的关系
5 _proto_是站在对象角度来说的
6 prototype 是站在构造函数角度来说的
代码
function Person(name){
this.name = name;
}
Person.prototype.showName = function(){
console.log(this.name);
}
function Student(name,age){
Person.call(this,name);
this.age = age;
}
Student.prototype = new Person();
Student.prototype.contructor = Student;
Student.prototype.showAge = function(){
console.log(this.age);
}
var stu = new Student('张三',12);
stu.showName();
stu.showAge();
【原型继承+借用构造函数继承】它的特点就是属性每个实例一份
1、原型链
1)构造函数、原型和实例的关系
①构造函数都有一个属性prototype,这个属性是一个对象(Object的实例)
②原型对象prototype里面有一个constructor属性,该属性指向原型对象所属的构造函数
③实例对象都有一个_proto_属性,该属性也指向构造函数的原型对象,它是一个非标准属性,不可以用于编程,它是用于浏览器自己使用的
2)prototype与_proto_的关系
①prototype是构造函数的属性
②_proto_是实例对象的属性
——这两者都指向同一个对象
【总结】i)函数也是对象,对象不一定是函数;
ii)对象的本质:无序的键值对集合;键值对当中的值可以是任意数据类型的值
iii)对象就是一个容器,这个容器当中放的是(属性和方法)
3)属性搜索
①在访问对象的某个成员的时候会先在对象中找是否存在
②如果当前对象中没有就在构造函数的原型对象中找
③如果原型对象中没有找到就到原型对象的原型上找
④知道Object的原型对象的原型是null为止
2、Function
——所有函数都是Function的实例
①本地对象:独立于宿主环境(浏览器)的对象——包括Object、Array、Date、RegExp、Function、Error、Number、String、Boolean
②内置对象——包括Math、Global(window,在js中就是全局变量),使用的时候不需要new
③宿主对象——包括自定义对象、DOM、BOM
继承
继承是指一个对象直接使用另一对象的属性和方法。
“继承”是面向对象软件技术当中的一个重要概念。
“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把
这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性
和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某
些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功
能。另外,为子类追加新的属性和方法也是常见的做法。
单继承的定义格式编辑
class <派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
};
其中,<派生类名>是新定义的一个类的名字,它是从<基类名>中派生的,并且按指定
的<继承方式>派生的。<继承方式>常使用如下三种关键字给予表示:
public 表示公有基类;
private 表示私有基类;
protected 表示保护基类;
多继承的定义格式编辑
如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类新定义成员>
};
可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个。
派生类的三种继承方式
公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。
1. 公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类
的私有成员仍然是私有的。
2. 私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
3. 保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只
能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。