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
这是创建原型继承的一种方法