//继承
<script>
function Stu(name, age){
this.name = name;
this.age = age;
this.show = function(){
document.write(name + " " + age + "<br/>");
}
this.com = function(){
document.write("学费是200<br/>");
}
}
var s = new Stu("小白", 2);
s.show();
s.com();
function MidStu(name, age){
this.stu = Stu;
this.stu(name, age); //JS的继承实际上是对象冒充,这句代码必须写,先让this.stu()指向Stu()函数,然后再给stu()传两个参数并调用执行
//因为JS是动态语言,如果不加以执行就不能得到动态效果
}
var m = new MidStu("中学生", 10);
m.show();
m.com();
function Pupil(name, age){
this.stu = Stu;
this.stu(name, age);
//这里覆盖了父类的com()函数,JS也只支持覆盖,一个函数名只能表示一个函数
this.com = function(){
document.write("学费是100<br/>");
}
}
var p = new Pupil("小明", 5);
p.show();
p.com();
</script>
最后输出为:
小白 2
学费是200
中学生 10
学费是200
小明 5
学费是100
//继承综合例子
<script>
function Master(name){
this.m_name = name;
this.show = function(){
document.write("这是" + this.m_name + "<br/>");
};
this.feed = function(animal, food){
document.write(this.m_name + "给" + animal.a_name + animal.speak() + "喂" + food.f_name + "<br/>");
};
}
function Animal(name){
this.a_name = name;
}
function Food(name){
this.f_name = name;
}
function Dog(name){
this.animal = Animal;
this.animal(name);
this.speak = function(){
return "汪汪汪";
};
}
function Cat(name){
this.animal = Animal;
this.animal(name);
this.speak = function(){
return "喵喵喵";
};
}
function Fish(name){
this.food = Food;
this.food(name);
this.kind = function(){
document.write("这是鱼肉<br/>");
};
}
function Bone(name){
this.food = Food;
this.food(name);
this.kind = function(){
document.write("这是骨头<br/>");
};
}
var m1 = new Master("小明");
var m2 = new Master("小红");
var dog = new Dog("狗");
var cat = new Cat("猫");
var fish = new Fish("鱼肉");
var bone = new Bone("骨头");
m1.show();
bone.kind();
m1.feed(dog, bone);
m2.show();
fish.kind();
m2.feed(cat, fish);
</script>
输出:
这是小明
这是骨头
小明给狗汪汪汪喂骨头
这是小红
这是鱼肉
小红给猫喵喵喵喂鱼肉
//闭包主要跟GC垃圾回收有关用来保护变量:一个函数内的子函数被该函数外的变量调用就是一个闭包(A内部的函数B被A外面的C调用)
<script>
function a(){
var i = 0;
function b(){
document.write(++i);
}
return b;
}
var c = a(); //由于a()执行的结果是返回b的地址,这句代码就让c指向了函数b()的地址,那么下一句c()就相当于执行b(),输出为1
c();
</script>
如果直接 a();当执行完之后a里面的变量i就会被回收,但是用了 var c = a(); 则会暂时保留i的空间