一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
导言
对于创建型模式,前面的篇幅已经说了三种:单例模式、工厂模式和建造者模式。还有最后一种,就是今天要说的原型模式。Java、C++等面向对象的编程语言来说,原型模式实际开发中用的可能比较少。而对于JavaScript开发者来说应该是比较熟悉的,因为JavaScript是基于原型的面向对象语言。
原型模式
原型
JavaScript中的对象有一个特殊的[[Prototype]]内置属性,它其实就是对于其他对象的引用。几乎所有的对象在创建时[[Prototype]]属性都会被赋予一个非空的值。那[[Prototype]]属性值有什么作用呢,举个例子:
let obj = {
name: 'parent'
}
let newObj = Object.create(obj)
console.log(newObj.name) // parent
看到了吧,输出的是obj.name的值,其实newObj中没有这个属性值,只是它在创建的对象中存在[[Prototype]]属性,而它只想obj,如果在当前对象中找不到的属性或方法,会通过[[Prototype]]往上继续找,直到Object.prototype对象上,它算是个尽头吧。
设计思想
原型模式是基于原型继承的,在这种模式中,被创建的对象充当其他对象的原型。实际上,原型(prototype)是被创建的每个对象构造函数的蓝图。
let myCar = {
name:"Ford Escort",
brake:function(){
console.log("Stop! I am applying brakes");
}
Panic : function (){
console.log ( "wait. how do you stop thuis thing?")
}
}
// 使用object的create方法创建个对象yourCar
let yourCar = object.create(myCar)
// 现在它就是另一个的原型了
console.log (yourCar.name)
原型模式也是属于创建型设计模式,因为它也是新生成一个对象,但其思想与其他三种创建型设计模式有很大不同,它创建的对象虽然也是全新的对象,但对象之间是有关联的,就像上面代码实例中,即使当前对象没有某个属性或方法,但可以通过原型链一直往上继续找,直至最顶层对象中。
有一对相关概念叫做深拷贝和浅拷贝,浅拷贝指的就是原型模式这种创建对象的行为。