F2E_3JS原型与闭包


做毕设的时候看JS学到OO就没看下去了,到现在过了这么久。当时看原型就不是很明白。前段时间看jQuery就顺带看了看原生JS,首先就是原型prototype。

prototype属性:所有javascript内部对象都有只读的prototype属性,可以向其原型中动态添加功能(属性和方法),但该对象不能被赋予不同的原型。然而,用户定义的对象可以被赋给新的原型。

说白了,用prototype定义的属性、方法都是静态的,而且原型属性可以作为对象的默认值,对象本身属性会覆盖同名原型属性。

还有个原型链: 原型链

ClassB.prototype = new ClassA();  //ClassB以ClassA的对象为原型
//objectB.__proto__=ClassA    对象的__proto__属性

闭包: 所谓 闭包,是动态语言才有的东西,就是函数内部有匿名函数,它能访问到被定义的作用域里的变量。

关于闭包的定义,《javascript王者归来》如是说: 闭包

你能看懂不?

反正我是看不懂。个人理解,虽然退出外层函数了,但是由于被引用了,所以外层函数定义的变量不会被回收,子函数就可以使用父函数中的局部变量。

举个例子应该比较明白。

// A是一个普通函数
function A(a){
	return a;
}
// B是一个带函数返回值的函数
function B(b){
	return function(){
		return b;
	}
}
var x=A(10);//A除了返回a什么也没做,没产生闭包
var y=B(20);//B返回了一个匿名函数引用,它访问到B()被调用时的环境,因此产生了闭包,y()返回20
var z=B(30);//z()返回30
alert("x="+x+" y()="+y()+" z()="+z());

alert的当然就是10,20,30。

闭包的用处:

1、保护函数内的变量安全。上述例子,函数B中的b只有匿名函数才能访问,而无法通过其他途径访问到,因此保护了b的安全性。

2、在内存中维持一个变量。依然如前例,由于闭包,函数B中的b一直存在于内存中,也就类似于类变量了。

总而言之原型用来实现继承,闭包用来封装。