JavaScript的面向对象
[TOC]
与Java的区别
JavaScript的面向对象编程和大多数其他语言如Java、C#的面向对象编程都不太一样。
JavaScript不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程。
123456789101112131415var Student = {name: 'Robot',height: 1.2,run: function () {console.log(this.name + ' is running...');}};var xiaoming = {name: '小明'};xiaoming.__proto__ = Student;xiaoming.name; // '小明'xiaoming.run(); // 小明 is running...继承而来的方法JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。
创建对象
JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象。
当我们用
obj.xxx
访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找,如果还没有找到,就一直上溯到Object.prototype
对象,最后,如果还没有找到,就只能返回undefined
。构造函数
除了直接用
{ ... }
创建一个对象外,JavaScript还可以用一种构造函数的方法来创建对象。它的用法是,先定义一个构造函数:12345678910function Student(name) {this.name = name;this.hello = function () {alert('Hello, ' + this.name + '!');}}//通过new修饰后即可将其变成一个对象,如果不写new,这就是一个普通函数,它返回undefined。但是,如果写了new,它就变成了一个构造函数,它绑定的this指向新创建的对象,并默认返回this,也就是说,不需要在最后写return this;。var xiaoming = new Student('小明');xiaoming.name; // '小明'xiaoming.hello(); // Hello, 小明!通过new创建的对象都指向同一个原型:
123xiaoming ↘xiaohong -→ Student.prototype ----> Object.prototype ----> nullxiaojun ↗
通过class创建和继承对象
在es6之后,通过引入了class关键字简化了对象的创建以及对象的继承。
12345678910class Student {//构造函数constructor(name) {this.name = name;}//定义在原型对象上的函数hello(),没有关键字functionhello() {alert('Hello, ' + this.name + '!');}}对象的继承(和java简直超级像有木有)
123456789class PrimaryStudent extends Student {constructor(name, grade) {super(name); // 记得用super调用父类的构造方法!this.grade = grade;}myGrade() {alert('I am at grade ' + this.grade);}}