前面我们用闭包的知识,可以实现封装。面向对象编程还有一个重要的特性,那就是继承。

JavaScript的所有数据都可以看成对象。

要实现面向对象编程,你首先要明白两个基本概念:

1、类:类是对象的类型模板,例如,定义Student类来表示学生,类本身是一种类型,Student表示学生类型,但不表示任何具体的某个学生;

2、实例:实例是根据类创建的对象,例如,根据Student类可以创建出xiaomingxiaohongxiaojun等多个实例,每个实例表示一个具体的学生,他们全都属于Student类型。

不过由于在JavaScript中没有类(class)这个概念,而是通过原型(prototype)来实现面向对象编程。普通对象没有原型prototype,但是有__proto__属性。

首先,我们来定义一个Student对象:

var Student = {

  name : 'jack',

  age: 20,

  run: function(){

    console.log(this.name + " is running!");

  }

}

var rose = {

  name: 'rose'

}

rose.__proto__ = Student;

rose.name;//rose

rose.age;//20

rose.run();//rose is running!

rose有自己的name属性,但是并没有定义age属性和run()方法。显然,这些是从Student继承而来。

var bird = {

  fly:function(){

    console.log(this.name + " is flying!");

  }

};

rose.__proto__ = bird;

rose.run();//Uncaught TypeError: rose.run is not a function

rose.fly();//rose is flying!

所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已,你可以把rose指向任何对象。在编写JavaScript代码时,不要直接用obj.__proto__去改变一个对象的原型,并且,低版本的IE也无法使用__proto__。Object.create()方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有。代码如下:

var Student = {

  name : 'jack',

  age: 20,

  run: function(){

    console.log(this.name + " is running!");

  }

}

function CreateStudent(name){

  var student = Object.create(Student);

  student.name = name;

  return student;

}

var rose = CreateStudent('rose');

rose.name;//rose

rose.age;//20

rose.run();//rose is running!

rose.__proto__ === Student;//true

这是创建原型继承的一种方法。

 

 

posted on 2016-03-03 10:58  tse_tung  阅读(174)  评论(0)    收藏  举报