js模拟类继承小例子

复制代码 代码如下:

  //使用原型继承,中间使用临时对象作为Child的原型属性,临时对象的原型属性再指向父类的原型,

  //防止所有子类和父类原型属性都指向通一个对象.

  //这样当修改子类的原型属性,就不会影响其他子类和父类

  function extend(Child, Parent) {

  var F = function(){};

  F.prototype = Parent.prototype;

  Child.prototype = new F();

  Child.prototype.constructor = Child;

  Child.base = Parent.prototype;

  }

  function Parent(name)

  {

  this.aa = 123;

  this.getName = function() {return name;}; //使用闭包模拟私有成员

  this.setName = function(value){name=value;};

  }

  Parent.prototype.print = function(){alert("print!");};

  Parent.prototype.hello = function()

  {

  alert(this.getName() + "Parent")

  };

  function Child(name,age)

  {

  Parent.apply(this, arguments);//调用父类构造函数来继承父类定义的属性

  this.age = age;

  }

  extend(Child,Parent); //继承Parent

  Child.prototype.hello = function() //重写父类hello方法

  {

  alert(this.getName() + "Child");

  Parent.prototype.hello.apply(this,arguments); //调用父类同名方法

  };

  //子类方法

  Child.prototype.doSomething = function(){ alert(this.age + "Child doSomething"); };

  var p1 = new Child("xhan",22);

  var p2 = new Child("xxx",33);

  p1.hello();

  p2.hello();

  p1.doSomething(); //子类方法

  p1.print(); //父类方法

  alert(p1 instanceof Child); //true

  alert(p1 instanceof Parent);//true