变量作用域(全局作用域、局部作用域)
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量,在函数外部自然无法读取 函数内的局部变量。
什么是闭包(闭包的原理)
闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函 数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质 上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的特点
闭包特性1: 函数内部的函数所引用的变量 会被保存下来
闭包特性2: 由于内部函数所引用的外部变量会被保存下来 所以变量会一直在内存中保存直到 浏览器被关闭,垃圾回收机制失效
闭包的应用场景
局部变量的累加
自执行的匿名函数保存循环变量
使用闭包的注意点
1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包, 否则会造成网页的性能问题,在IE中可能导致内存泄露。
2、闭包会在父函数外部,改变父函数内部变量的值。
构造函数继承
将父对象的构造函数绑定在子对象上。
call/apply继承
在子对象构造函数中利用call或apply将父对象指向子对象的实例对象。
Prototype(原型)--原型的概念
Javascript规定,每一个函数都有一个prototype对象属性,指向另一个对象(原型链)。
prototype对象属性的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把 那些不变(公用)的属性和方法,直接定义在prototype对象属性上。
prototype就是调用构造函数创建的那个实例对象的原型(__proto__)。
prototype可以让所有对象实例共享它所包含的属性和方法。也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。
构造函数与实例
构造函数(类)---不具备方法和属性,只能用来构造实例对象,构造函数里面添加的 是属性(因为一般情况下属性各不相同)原型里面添加的是方法(因为方法都一样)
实例(实例对象),具有一定的功能,被构造函数(类)构造出来的。
Prototype模式的其他验证方法
hasOwnProperty() : 看是不是对象自身下面的属性, 只在属性存在于实例中时才返回 true。
p1.hasOwnProperty('name')
in操作符用来判断某个属性属于某个实例对象,可以是对象的直接属性,也可以是通过prototype继承的属性(包括Object下面的属性)。alert('name' in p1);
toString() :系统对象下面都是自带的 , 系统对象都有toString(),自己写的对象都是通过原型链找Object下面的,可以把对象转成字符串, 可以做进制转换或者类型的判断。
constructor:实例对象的构造函数 (实例对象.constructor)
instanceof:判断一个对象是否是一个构造函数(类)的实例。p1instanceof Person
isPrototypeOf (): 判断一个实例对象是否指向了该构造函数的原型对象。
Person.prototype.isPrototypeOf(p2)
原型链继承(JS原型与原型链)
实例对象与原型之间的连接,叫做原型链。__proto__( 隐式连接 )
JS在创建对象的时候,都有一个叫做proto的内置属性,用于指向创建它的函数对象的原型对象prototype。
内部原型(__proto__)和构造器的原型(prototype)
1、每个对象都有一个__proto__属性,原型链上的对象正是依靠这个属性连结在一起
2、作为一个对象,当你访问其中的一个属性或方法的时候,如果这个对象中没有这个方法或属性,那么Javascript引擎将会访问这个对象的__proto__属性所指向上一个对象,并在那个对象中查找指定的方法或属性,如果不能找到,那就会继续通过那个对象的__proto__属性指向的对象进行向上查找,直到这个链表结束。
原型链的最外层:object.prototype-->null
混合继承(构造函数+原型混合方式实现js的继承)