友好提示: 对工厂模式、构造函数模式、原型不熟悉的小伙伴,可以看一下我的前两篇文章(欢迎指教)
根据几种简单的创建方式、工厂创建、构造(改进构造)函数创建的例子,可以得出,理想的创建对象形式,主要有四个指标(要求):
- 类型具体:创建的实例有具体的类型,而不是模糊的object
- 属性私有:一个实例独有其属性,不与其他实例共享
- 方法公用:同类型的不同实例之间,共同拥有一个公用方法
- 封装性好:一个类型的属性、方法,只能让其实例对象拥有、访问
为了满足上述要求,JS的原型出现了。所以在对涉及到原型的几个模式(原始的原型、构造+原型组合、动态原型、寄生构造函数、稳妥构造函数模式等),主要从上述四个角度去分析他们的利弊。
tips:对原型不熟悉的话,可以看一下面向对象之原型基础
一、原型模式创建对象
下面例子重写了原型对象:
此模式创建对象的优点:
- 类型具体
- 实例间实现了方法公用
此模式创建对象的缺点:
- 原型对象中的属性被所有实例共享,一旦一个实例改变了原型对象的某个属性,其余实例访问到的该属性也会被改变。
二、组合构造和原型模式
构造函数模式能使每个实例有单独的属性(属性私有)
原型模式能使不同实例之间共享同一个方法(方法公用)
所以索性把二者结合,既满足了属性私有,也满足了方法公用,即把属性都在构造函数中赋值;把方法都在原型对象中赋值。
此模式创建对象的优点:
- 类型具体
- 构造函数实现属性私有
- 原型模式实现了方法公用
此模式创建对象的缺点:
- 封装性比较差,原型对象中方法定义赋值,构造函数给属性定义赋值,不在同一个作用域。
三、动态原型模式
function Person(name,age,job){
this.name = name
this.age = age
this.job = job
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name)
}
}
}
没啥说的,改善了组合模式的封装性缺点
四、寄生构造函数模式
一句话:和工厂模式没有什么区别,工厂模式的有的好处和弊端它都有
五、稳妥构造函数模式
特点:
- 没有公共属性
- 其方法不引用this
- 不用new调用构造函数
- 适用于安全性要求较高,防止数据篡改的情况
function Person(name){
var o = new Object()
o.sayName = function(){
alert(name)
}
return o
}
var temp = Person('zhansgan')
zhangsan.sayName()
其实这就是个闭包,所以相对安全。
Thanks for Reading.....