Skip to content

Latest commit

 

History

History
108 lines (75 loc) · 3.57 KB

创建型-构造器模式.md

File metadata and controls

108 lines (75 loc) · 3.57 KB

构造器模式

在面向对象编程中,构造器是一个当新建对象的内存被分配后,用来初始化该对象的一个特殊函数。在 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对象之间共享