JavaScript的所有数据都可以看作对象,那么我们是不是已经在使用面向对象编程了呢?
当然不是。如果我们只使用数字、数组、字符串和基本的.}定义了对象,我们就无法发挥面向对象编程的威力。
JavaScript的面向对象编程不同于大多数其他语言,如Java和C#。如果你熟悉Java或者C#,那好,你必须了解面向对象的两个基本概念:
1.类:类是对象的类型模板。例如,学生类被定义为代表学生。班级本身是一个类型,学生代表一个学生类型,但不代表任何特定的学生;
2.实例:实例是根据类创建的对象。比如小明、小红、小军等几个实例可以根据Student类创建。每个实例代表一个特定的学生,它们都属于学生类型。
因此,类和实例是大多数面向对象编程语言的基本概念。
但是,在JavaScript中,这个概念需要改变。JavaScript没有区分分类和实例的概念,而是通过原型实现面向对象编程。
原型意味着当我们想要创建一个名为小明的具体学生时,我们没有可用的学生类型。然后呢?恰好有这样一个现成的物件:
var robot={ name: 'Robot ',height: 1.6,run : function(){ console . log(this . name '正在运行.');}};我们看到这个机器人对象有名字,有身高,会跑,有点像小明。就照着它“创造”小明吧!
所以我们把它改名为学生,然后创造了小明:
var Student={ name: 'Robot ',height: 1.2,run : function(){ console . log(this . name '正在运行.');}};Var小明={name: '小明' };小明。__proto__=学生;注意最后一行代码把小明的原型指向了对象Student,似乎小明是从Student继承过来的:
小明.姓名;//‘小明’小明. run();//小明在跑.小明有自己的name属性,但没有定义run()方法。但是,既然小明继承了Student,只要Student有run()方法,小明也可以调用:
JavaScript原型链和Java Class的区别在于它没有“类”的概念,所有的对象都是实例。所谓的继承关系只是将一个对象的原型指向另一个对象。
如果你把小明的原型指向其他物体:
var Bird={ fly : function(){ console . log(this . name '正在飞行.');}};小明。__原型__=鸟;小明现在跑不动了,他成了一只鸟:
小明. fly();//小明在飞.在运行JavaScrip代码的过程中,您可以将小明从Student更改为Bird,或者更改为任何对象。
请注意,上述代码仅用于演示目的。编写JavaScript代码时,不要使用obj。__proto__直接改变一个对象的原型,IE的低版本不能使用__proto__。Object.create()方法可以传入一个原型对象,并基于该原型创建一个新对象,但是新对象没有属性。因此,我们可以编写一个函数来创建xiao:
//原型对象: varstudent={ name : ' robot ',身高: 1.2,run : function(){ console . log(this。名称“正在运行…”);}};函数createStudent(name) {//基于Student原型: var s=object . create(Student)创建一个新对象;//初始化新对象: s.name=name返回s;}var肖明=createStudent('肖明');小明. run();//小明在跑.小明。_ _ proto _ _==学生;//真