面向对象编程
传统的基于class的面向对象言语如Java中,都有两个基本观点:
- 类:类是对象的实例模版,自身是一种范例。如:
- 实例:实例是依据类建立的对象。
Student xiaoming = new Student()
而JS不辨别类和实例的观点,它经由历程原型(prototype)完成面向对象。JS建立对象是用原型,完成继续也是用原型。
建立对象:
var Student = {name: 'abc', height: 1.7};
var xiaoming = {name: 'xiaoming'};
xiaoming._proto_ = Student;
建立对象
JS对每一个建立的对象都邑设置一个原型,指向它的原型对象。
当运用obj.***
接见一个对象的属性时,JS如今当前对象上查找该属性;假如没找到,就到其原型对象上找;假如还没找到,就一向上溯到Object.prototype
这个原型对象;末了,假如还没找到,就返回undefined
。这个历程能够示意为一个原型链。
// 组织函数对象
function Student(name) {
this.name = name; //这里设置了每一个对象的属性
}
// 原型对象
Student.prototype.hello = function() {
alert('Hello, ' + this.name); //这里设置了一切对象同享的hello函数,经由历程继续取得
}
// 实例对象
var xiaoming = new Student('小明');
var xiaohong = new Student('小红');
原型链以下(图中赤色箭头是原型链):
xiaoming \
xiaohong — Student.prototype —-> Object.prototype —-> null
补充:
见犀牛书
原型继续
Java中,继续的实质是:扩大一个已有的Class,天生一个新的Subclass。由于Java严厉辨别类和实例,继续实际上是范例的扩大。
而JS没法直接扩大一个Class,由于不存在Class这类范例,JS采纳的是原型继续。
斟酌基于Student
扩大出PrimaryStudent
,原型链必需修正成如许:
new PrimaryStudent() —-> PrimaryStudent.prototype —-> Student.prototype —-> Object.prototype —-> null
完成要领:
// PrimaryStudent的组织函数
function PrimaryStudent(props) {
Student.call(this, props);
this.grade = props.grade || 1;
}
// 引入中心对象:空函数F
function F() {}
F.prototype = Student.prototype;
// 修正两个属性,以完成上述原型链
PrimaryStudent.prototype = new F();
PrimaryStudent.prototype.constructor = PrimaryStudent;
// 在PrimaryStudent的原型对象上定义要领
PrimaryStudent.prototype.getGrade = function() {
return this.grade;
}
// 建立子类对象
var xiaoming = new PrimaryStudent({name: '小明', grade: 60});
// 考证原型
xiaoming.__proto__ === PrimaryStudent.prototype; //true
xiaoming.__proto__.__proto__ === Student.prototype; //true
原型链图示: