es5里面的类

1、最简单的类
function Person(){
  this.name = '张三';
  this.age = 20;
}
var p = new Person();
alert(p.name);

2、构造函数和原型链里面增加方法
function Person(){
  this.name = '张三';
  this.age = 20;
  this.run=function(){
    alert(this.name + '在运动');
  }
}
Person.prototype.sex = '男';
Person.prototype.work = function(){
  alert(this.name + '在工作');
}
var p = new Person();
alert(p.name);
p.run();
p.work();

es5中的两种继承

1、构造函数继承(及对象冒充继承)

function Person(){
  this.name = '张三';
  this.age = 20;
  this.run=function(){
    alert(this.name + '在运动');
  }
}
//原型链上面的属性会被多个实例共享 构造函数不会
Person.prototype.sex = '男';
Person.prototype.work = function(){
  alert(this.name + '在工作');
}
//web 继承Person类 原型链+对象冒充的组合继承模式
function Web(){
  Person.call(this);//对象冒充实例继承
}

var w = new Web();
// w.run(); //对象冒充可以继承构造函数中的属性和方法

w.work(); //对象冒充无法继承原型链上的属性和方法
//w.work is not a function

  注意:对象冒充可以继承构造函数中的属性和方法,但无法继承原型链上的属性和方法。(Person.call(this))

2、原型链继承

function Person(){
  this.name = '张三';//属性
  this.age = 20;
  this.run=function(){//实例方法
    alert(this.name + '在运动');
  }
}
//原型链上面的属性会被多个实例共享 构造函数不会
Person.prototype.sex = '男';
Person.prototype.work = function(){
  alert(this.name + '在工作');
}
//web 继承Person类 原型链+对象冒充的组合继承模式
function Web(){
  
}
Web.prototype=new Person();//原型链实现继承
var w = new Web();
// w.run(); //原型链实现继承:可以继承构造函数中的属性和方法 也可以继承原型链上的属性和方法

w.work();

  注意:原型链实现继承:可以继承构造函数中的属性和方法 也可以继承原型链上的属性和方法。(Web.prototype=new Person();)

但是原型链继承也有缺点:

function Person(name,age){
  this.name = name;//属性
  this.age = age;
  this.run=function(){//实例方法
    alert(this.name + '在运动');
  }
}
//原型链上面的属性会被多个实例共享 构造函数不会
Person.prototype.sex = '男';
Person.prototype.work = function(){
  alert(this.name + '在工作');
}

function Web(name,age){
  
}
Web.prototype=new Person();//原型链实现继承
var w = new Web('赵四',20);//实例化子类的时候没发给父类传参
// w.run(); 

w.work();//undefined在工作

  注意:w.work();//undefined在工作 ;实例化子类的时候没发给父类传参,这个是原型链继承的问题。

原型链+构造函数继承的方式可避免以上的问题:

function Person(name,age){
  this.name = name;//属性
  this.age = age;
  this.run=function(){//实例方法
    alert(this.name + '在运动');
  }
}
//原型链上面的属性会被多个实例共享 构造函数不会
Person.prototype.sex = '男';
Person.prototype.work = function(){
  alert(this.name + '在工作');
}
function Web(name,age){
  Person.call(this,name,age);//对象冒充继承 可以继承构造函数里面的属性和方法,实例化子类传参。
}
Web.prototype=Person.prototype;//原型链实现继承
var w = new Web('赵四',20);//实例化子类的时候没发给父类传参
w.run(); //赵四在运动
w.work();//赵四在工作

var w1 = new Web('王五',22);
w1.run(); //王五在运动
w1.work();//王五在工作