以下以《JavaScript高级程序设计》例子为例。
一、创建对象的方式
1. 工厂模式:
function createPerson(name,age,job){
let o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
console.log(this.name);
};
return o;
}
let person1=createPerson("me",20,"Front-end Engineer");
let person2=createPerson("her",18,"actor");
每次调用函数返回一个具有属性和方法的对象。然而这种方法无法获取对象的具体类型,因为在createPerson中都是通过new Object()来创建实例,实例的constructor都是Object,如下所示:
因为这个原因,构造函数模式出现了。
2. 构造函数模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
console.log(this.name);
}
}
var person1=new Person("me",20,'Front-end Engineer');
var person2=new Person("her",18,'model');
主要靠new的执行过程:
(1)创建一个新对象;
(2)将构造函数的作用于赋给新对象(this指向了新对象,新对象的__proto__属性指向构造函数的prototype);
(3)执行构造函数中的代码(为新对象添加属性);
(4)返回这个新对象。
该方法的缺点主要是每个new出来的实例都要创建一遍相同的方法,由于函数是对象,存储在堆区,每个实例的栈区域的sayName名字都会指向自身实例的一个堆区,其中堆区会创建一个这样的函数对象。我们想使用的方法都是相同的,没必要每个实例上都创建。
于是我们可以这样:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=jo