在面向对象编程中,构造器是一个当新建对象的内存被分配后,用来初始化该对象的一个特殊函数。在 JavaScript 中几乎所有的东西都是对象
Object 构造器用于创建特定类型的对象————准备好对象以备使用,同时接收构造器可以使用的参数,以在第一次创建对象时,设置成员属性的方法的值
对象创建
创建对象的三种基本方式
// 第一种
let obj = {};
// 第二种
let obj = Object.create(null);
// 第三种
let obj = new Object();
看着《Javascript 设计模式》这本书,讲得比较理论,其实构造器模式
真的是天天都在用了,举个例子
双十一过了,小彭吐槽小何没有女朋友,作为一名程序狗,岂能让人看不起,我没对象,我还不能自己 new 一个对象出来?
于是,小何洋洋洒洒的在 VS Code 中写下了这段代码 :
const myGirlFriend = {
name: "小何女朋友",
age: 18,
cup: "36D",
hobby: "吃鸡,王者"
};
过了两天,小何的基友小谭跑过来要小何也帮他 new 一个女朋友,小何心想,这特么不简单吗,问: “你女朋友想找多大的,什么 cup,爱好是啥” 于是,小何很神气的又写下了这段代码
const tanGirlFriend = {
name: "小谭女朋友",
age: 22,
cup: "36E",
hobby: "旅行,爬山"
};
让小何意想不到的是,他居然火了,很多单身同胞都来找他,要他帮忙 new 一个对象
于是陆陆续续来人,小何一看,妈呀,整个班的人都来了,30 号人,小何告诉自己,我可以,我行 !
但是意想不到的是,出名到整个学院了,几百上千号人都来,要死要死,我要写啥时候,于是,他急中生智,用了构造函数
于是小何写出了一个可以自动创建女朋友的函数:
function GirlFriend(name, age, cup, hobby) {
this.name = name;
this.age = age;
this.cup = cup;
this.hobby = hobby;
this.toCopyright = function() {
console.log(`我是被小何创造出来的对象,我叫${this.name}`);
};
}
然后呢,小何再也不需要手写字面量了,每次来一个人,我就调用一次
const daiGirl = new GirlFriend("小戴女朋友", 20, "36F", "机车");
const xieGirl = new GirlFriend("小谢女朋友", 19, "36C", "看书");
像 GirlFriend
这样当新建对象的内存被分配后,用来初始化该对象的特殊函数,就叫做构造器。
用构造器去初始化对象,这就是构造器模式,牛逼!
带原型的构造器
上边的代码,我们来看看,会有什么问题
首先继承上会变得困难,其次是,小何想,像 this.toCopyright()
这样的函数,应该在所有的GirlFriend
类型实例之间共享。(这是我的版权!!!)
JavaScript 中函数有一个 prototype
的属性。当我们调用 JavaScript 的构造器创建一个对象时,新对象就会具有构造器原型的所有属性。
稳啊,太强了!
function GirlFriend(name, age, cup, hobby) {
this.name = name;
this.age = age;
this.cup = cup;
this.hobby = hobby;
}
GirlFriend.prototype.toCopyright = function() {
console.log(`我是被小何创造出来的对象,我叫${this.name}`);
};
现在 toCopyright()
的单一实例就能在所有GirlFriend
对象之间共享