js中含有继承,但不是extends关键字来实现继承的,怎样实现呢?先看一下代码:
<html>
<head>
<script language="javascript">
function Stu(name, age) {
this.name = name;
this.age = age;
this.show = function() {
window.alert(this.name + " " + this.age);
}
}
function MidStu(name,age) {
this.stu = Stu;
this.stu(name, age);//js中实际上是通过对象冒充,来实现继承
}
function Pupil(name, age) {
this.stu = Stu;
this.stu(name,age);
}
var midStu = new MidStu("lala", 20);
midStu.show();
</script>
</head>
</html>
Stu类为父类,而MidStu和Pupil是从Stu继承得来。这两个类中都含有 this.stu = Stu; this.stu(name, age);语句,因为,js通过对象冒充实现继承,同样js也可以通过对象冒充实现多重继承的效果,用的少。看看这两句关键代码,this.stu = Stu;相当与调用Stu这个构造方法,这样stu也就指向了Stu方法中的那些属性和方法。但是如果不调用stu方法,stu方法不执行,属性就不会被赋值,所以还必须要有第二句代码。
闭包:js中的闭包和垃圾回收机制是相关联的,闭包实际上是涉及到一个对象的属性,何时被垃圾回收何时处理的问题。闭包的属性不会在方法执行之后就被处理。看下面的代码:
<html>
<head>
<script language="javascript">
/*闭包*/
function A() {
var i = 0;
function b() {
window.alert(i++);
}
return b;
}
var c = A();
c();
</script>
</head>
<body>
</body>
</html>
c指向A()之后,调用C();会输出0,这是因为A中i变量的值被保留了,形成了闭包。但是如果只写A();i变量的值会被垃圾回收机制给回收。