JavaScript之面向对象_动力节点Java学院整理

  

JavaScript的所有数据都可以看成对象,那是不是我们已经在使用面向对象编程了呢?

  

当然不是。如果我们只使用数字数组,字符串以及基本的{…}定义的对象,还无法发挥出面向对象编程的威力。

  

JavaScript的面向对象编程和大多数其他语言如Java、c#的面向对象编程都不太一样。如果你熟悉Java或c#,很好,你一定明白面向对象的两个基本概念:

  

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

  

实例是根据类创建的对象,例如,根据学生类可以创建出小明,小红,小军等多个实例,每个实例表示一个具体的学生,他们全都属于学生类型。

  

所以,类和实例是大多数面向对象编程语言的基本概念。

  

不过,在JavaScript中,这个概念需要改一改.JavaScript不区分类和实例的概念,而是通过原型(原型)来实现面向对象编程。

  

原型是指当我们想要创建小明这个具体的学生时,我们并没有一个学生类型可用。那怎么办?恰好有这么一个现成的对象:

     ={var机器人   名称:“机器人”,   高度:1.6,   运行:函数(){   console.log (this.name +“运行…”);   }   };      

我们看这个机器人对象有名字,有身高,还会跑,有点像小明,干脆就根据它来“创建“小明得了!

  

于是我们把它改名为学生,然后创建出小明:

        var={学生   名称:“机器人”,   高度:1.2,   运行:函数(){   console.log (this.name +“运行…”);   }   };   var小明={   的名字:“小明”   };   小明。__proto__=学生;      

注意最后一行代码把小明的原型指向了对象学生,看上去小明仿佛是从学生继承下来的:

        xiaoming.name;//毙∶鳌?   xiaoming.run ();//小明运行…      

小明有自己的名字属性,但并没有定义运行()方法。不过,由于小明是从学生继承而来,只要学生有运行()方法,小明也可以调用:

  

 JavaScript之面向对象_动力节点Java学院整理

  

JavaScript的原型链和Java的类区别就在,它没有“类”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。

  

如果你把小明的原型指向其他对象:

        var鸟={   飞:函数(){   console.log (this.name +“飞…”);   }   };   小明。__proto__=鸟;      

现在小明已经无法运行()了,他已经变成了一只鸟:

        xiaoming.fly ();//小明飞…      

在JavaScrip代码运行时期,你可以把小明从学生变成鸟,或者变成任何对象。

  

请注意,上述代码仅用于演示目的。在编写JavaScript代码时,不要直接用obj.__proto__去改变一个对象的原型,并且,低版本的IE也无法使用__proto__.Object.create()方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有,因此,我们可以编写一个函数来创建小明:

     //原型对象:   var={学生   名称:“机器人”,   高度:1.2,   运行:函数(){   console.log (this.name +“运行…”);   }   };   函数createStudent(名字){//基于学生原型创建一个新对象:   var s=Object.create(学生);//初始化新对象:   s.name=名称;   返回年代;   }   var小明=createStudent(“小明”);   xiaoming.run ();//小明正在运行…   小明。__proto__===学生;//真正的

JavaScript之面向对象_动力节点Java学院整理