JavaScript面向对象编程

2017-03-02  本文已影响0人  黄培忠

JavaScript的面向对象编程和大多数其他语言,比如Java、C#的面向对象是不太一样的,熟悉Java的明白面向对象的两个基本概念:

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

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

在JavaScript中,不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程

原型:指的是当我们想要创建xiaohuang这个具体的学生时,我们并没有一个Student类型可用,我们可以用这么一个现成的对象:

var robot = {

      name: 'Robot',

      height: 1.6,

      run: function () {

      console.log(this.name + ' is running...');

      }

};

可以看到robot对象有名字,有身高,会跑步,我们可以用来创建“xiaohuang”;

例如:

var Student = {

      name: 'Robot',

      height: 1.2,

      run: function () {

     console.log(this.name + ' is running...');

     }

};

var xiaohuang = {

      name: '小黄'

};

      xiaohuang.__proto__ = Student;

最后一行代码把xiaohuang的原型指向了Student:

xiaohuang.name;//‘小黄’

xiaohuang.run(); //小黄  is running...

xiaohuang有自己的属性,但并没有定义run()方法,不过,小黄从Student继承而来,只要Student有run方法,xiaohuang也可以调用

JavaScript的原型链和Java的class区别在于,它没有class的概念,所有的对象都是实例,所谓的继承关系是把一个对象的原型指向了另外一个对象而已

如果你把xiaohuang的原型指向了其他对象:

var Bird = {

      fly: function () {

      console.log(this.name + ' is flying...');

      }

};

      xiaohuang.__proto__ = Bird;

xiaohuang.fly();//小黄 is flying...

在JavaScript代码运行期间,你可以把xiaohuang从Student编程Bird,或者其他对象

注意:

在编写JavaScript代码是,不要直接用obj._ptoto_去改变一个对象的原型,并且低版本的IE也无法使用_ptoto_,Object.create()方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有,所以我们可以编写一个函数来创建xiaohuang

// 原型对象:

var Student = {

      name: 'Robot',

      height: 1.2,

      run: function () {

             console.log(this.name + ' is running...');

      }

};

function createStudent(name) {

// 基于Student原型创建一个新对象:

      var s = Object.create(Student);

// 初始化新对象:

      s.name = name;

      return s;

}

var xiaohuang = createStudent('小黄');

xiaohuang.run(); // 小黄 is running...

xiaohuang.__proto__ === Student; // true

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

上一篇 下一篇

猜你喜欢

热点阅读