Javascript是一门真正的面向对象语言,而不是很多人认为的没有java/C++等语言语法的就不是面向对象语言。只是Javascript面向对象的实现是基于对象实现的,秉承一切皆对象的思想。
既然Javascript的面向对象是基于对象的,那我们在这里先来探讨一下Javascript的对象模型。
- Javascript对象创建的方法
- 对象字面量
let person1 = { name: 'Jack Ma', age: 60 }; let person2 = { name: 'Polly', age: 58 } ;
- 对象字面量
对象字面量是最直接的对象创建方式,上面两个对象分别代表Jack Ma、Polly 两个人,他们除了成员一致外,没有实质关系,代码无法复用,使用不太方便。所以我们总结一下字面量的缺点有一下几点:
首先,虽然都是对象,但脱离的面向对象的概念,没有抽象层。
第二,两个对象都是表示一个类型的实例却没办法在逻辑层面表现出来。
第三,代码复用低,每一个对象都要去构建相同的属性,很麻烦。
第四,没有类型名称不利于继承,对面向对象是一大障碍。
对象工厂函数方法
let person = function (name, age) { return {name: name, age: age}; }; let person1 = person ('Jack Ma', 60); let person2 = person ('Polly', 58);
此方法解决了字面量中代码的复用问题,但是对继承等面向对象的支持还是不足。
- 使用构造函数的方式
function Person (name, age) {
this.age = age;
this.name = name;
}
let person1 = new Person ('Jack Ma', 60);
let person2 = new Person('Polly', 58);
构造函数就其实就是一个普通的函数,当对构造函数使用new进行实例化时,会将其内部this的指向绑定实例对象上,下面我们来创建一个Person构造函数(构造函数约定使用大写开头,和普通函数做区分)。
构造函数首先作为一个函数,当我们直接调用时,函数内部的this指针会指向函数当前的作用域。在一般情况下我们会将构造函数定义在全局环境中,所以这是this指向全局环境(window浏览器/global nodejs)。
当我们使用new调用构造函数实例话时,函数作用域发生改变,作用域指向了实例后的对象,所以这时this指向它的作用域时就变成了刚刚创建的实例了。所以创建完成的对象实例拥有了我们设置在this上面的所有属性。
(对象的创建就先说到这里。接下来我将总结new实例对象的过程秘辛)