- 多态经典案例
经典案例,看代码:
<html>
<head>
<script language="javascript">
function Master(){
//给动物喂食
this.feed=function(animal,food){
window.alert(animal.constructor);
document.write("主人给 "+animal.name+" 喂食 "+food.name+"<br/>");
}
}
//写食物
function Food(name){
this.name=name;
//...
}
function Fish(name){
this.food=Food;
this.food(name);
}
function Bone(name){
this.food=Food;
this.food(name);
}
function Taozi(name){
this.food=Food;
this.food(name);
}
//动物
function Animal(name){
this.name=name;
}
function Cat(name){
this.animal=Animal;//对象冒充
this.animal(name);
}
function Dog(name){
this.animal=Animal;//对象冒充
this.animal(name);
}
function Monkey(name){
this.animal=Animal;//对象冒充
this.animal(name);
}
var cat=new Cat("小猫咪");
var dog=new Dog("小狗");
var fish=new Fish("小鱼");
var bone=new Bone("骨头");
var master=new Master();
master.feed(cat,fish);
master.feed(dog,bone);
master.feed(new Monkey("小猴"),new Taozi("桃子"));
</script>
</head>
<body></body>
</html>
- 闭包 ----什么是闭包
闭包(closure)
javascript闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),而这些键值对是不会随上一级函数的执行完成而销毁。
<html>
<head>
<script language="javascript">
//闭包 closure
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
//闭包和GC有关系
a();//此时,内存中会给i分配一个空间,当运行完a()后,GC就把i的空间当作了垃圾
var c=a(); //当把 a() 赋给c后 ,GC没有把 i 的空间当作垃圾,因为他认为后面可能c还会用到i这个值,就不会把i的空间当作垃圾
c(); // 返回 1
c(); //返回 2,更能说明 i 的空间没有被当作垃圾来回收
</script>
</head>
<body></body>
</html>
这样在执行完var c=a()后,变量c实际上是指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示 i 的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内部的函数b
就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的闭包。
闭包的作用:就是在a执行完并返回后,闭包使得javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
进一步对闭包解释:
-
闭包和gc是相关联的
-
闭包实际上是涉及到一个对象的属性,何时被gc处理的问题
-
怎样才能对对象的属性形成一个闭包(看上面的案例)