//继承

<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的空间