前面我们用闭包的知识,可以实现封装。面向对象编程还有一个重要的特性,那就是继承。
JavaScript的所有数据都可以看成对象。
要实现面向对象编程,你首先要明白两个基本概念:
1、类:类是对象的类型模板,例如,定义Student类来表示学生,类本身是一种类型,Student表示学生类型,但不表示任何具体的某个学生;
2、实例:实例是根据类创建的对象,例如,根据Student类可以创建出xiaoming、xiaohong、xiaojun等多个实例,每个实例表示一个具体的学生,他们全都属于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
这是创建原型继承的一种方法。
浙公网安备 33010602011771号