对JavaScript闭包和原型理解
最近在学js脚本的一些东西觉得里面有2个知识点比较难理解所以做了如下总结。
1.闭包
简单的理解:一个函数a ,内部有个函数b,那么这个函数b当被作为a函数的返回值得时候被外部的全局变量引用了,那么这就是一个闭包。
官方解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
如:
a=function() {
var n=1;
b=function(
n=n+1;
alert(n)
}
return b;
}
var c=a()
alert(c())//相当于a()(),也就是调用了b()方法
alert(c())//再次调用了b(),这时候n还会加1,为3,因为b方法被c引用了无法释放内存所以b一次存在,那么b依赖于a,a就必须一直在内存,所以a内的n变量也就一直无法释放了
这就是一个闭包,外部变量c得到了a方法的返回值,那么这时候c就是等于b方法,再调用一次c(也就是b方法)
2.原型理解
简单的理解:就是给一个类扩展一些功能和方法。
//声明一个类
Person= function(name,age)
{
this.name=name;
this.age=age;
}
//使用原型给类添加方法
Person.prototype.show=function()
{
alert("我叫"+this.name+",今年"+this.age);
}
//创建两个对象
var p1 =new Person('张三',20);
var p2 =new Person('李四',23);
//调用原型里面的方法
person1.show();
person2.show();
可以看到person类/函数在原来只有2个属性的基础上多了一个show方法来展示自己的属性,就是说扩展的原型方法可以访问原函数内部的变量。
3.原型链
js中任何一个对象都有一个prototype的属性,在js中可以把它记为:__proto__(有点像父类指针super,指向它的上一个原型)(Function.prototype除外,它是函数对象,但它很特殊,他没有prototype属性(前面说道函数对象都有prototype属性))
简单的说:原型链的作用是用来继承的。
比如:
var a = {
x: 10,
calculate: function (z) {
return this.x + this.y + z
}
};
var b = {
y: 20,
__proto__: a
};
var c = {
y: 30,
__proto__: a
};
// 调用继承方法。
alert(b.calculate(30)); // 60
alert(c.calculate(30)); // 90
原理图如下:
constructor:当定义一个prototype的时候,会构造一个原形对象,这个原型对象存储于构造这个prototype的函数的原形方法之中.
function Foo(y){
this.y = y ;
}
Foo.prototype.x = 10;
Foo.prototype.calculate = function(z){
return this.x+this.y+z;
};
var b = new Foo(20);
alert(b.calculate(30));
当给foo对象添加了一个prototype属性的时候就会让foo的prototype的constructor指向foo。
也就是说 Foo.prototype.constructor=Foo //ture
总之js中继承用_proto_来实现。
参考文档:http://www.jb51.net/article/30750.htm
盗了一张图:原微博链接:http://www.php100.com/html/webkaifa/javascript/2012/1015/11260.html