【JS】面向对象之创建对象(二)

187 阅读2分钟

友好提示: 对工厂模式、构造函数模式、原型不熟悉的小伙伴,可以看一下我的前两篇文章(欢迎指教)

根据几种简单的创建方式、工厂创建、构造(改进构造)函数创建的例子,可以得出,理想的创建对象形式,主要有四个指标(要求):

  1. 类型具体:创建的实例有具体的类型,而不是模糊的object
  2. 属性私有:一个实例独有其属性,不与其他实例共享
  3. 方法公用:同类型的不同实例之间,共同拥有一个公用方法
  4. 封装性好:一个类型的属性、方法,只能让其实例对象拥有、访问

为了满足上述要求,JS的原型出现了。所以在对涉及到原型的几个模式(原始的原型、构造+原型组合、动态原型、寄生构造函数、稳妥构造函数模式等),主要从上述四个角度去分析他们的利弊。

tips:对原型不熟悉的话,可以看一下面向对象之原型基础

一、原型模式创建对象

下面例子重写了原型对象:

此模式创建对象的优点:

  1. 类型具体
  2. 实例间实现了方法公用

此模式创建对象的缺点:

  1. 原型对象中的属性被所有实例共享,一旦一个实例改变了原型对象的某个属性,其余实例访问到的该属性也会被改变。

二、组合构造和原型模式

构造函数模式能使每个实例有单独的属性(属性私有)

原型模式能使不同实例之间共享同一个方法(方法公用)

所以索性把二者结合,既满足了属性私有,也满足了方法公用,即把属性都在构造函数中赋值;把方法都在原型对象中赋值。

此模式创建对象的优点:

  1. 类型具体
  2. 构造函数实现属性私有
  3. 原型模式实现了方法公用

此模式创建对象的缺点:

  1. 封装性比较差,原型对象中方法定义赋值,构造函数给属性定义赋值,不在同一个作用域。

三、动态原型模式

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)
        }
    }
}

没啥说的,改善了组合模式的封装性缺点

四、寄生构造函数模式

一句话:和工厂模式没有什么区别,工厂模式的有的好处和弊端它都有

五、稳妥构造函数模式

特点:

  1. 没有公共属性
  2. 其方法不引用this
  3. 不用new调用构造函数
  4. 适用于安全性要求较高,防止数据篡改的情况
function Person(name){
    var o = new Object()
    o.sayName = function(){
        alert(name)
    }
    return o
}

var temp = Person('zhansgan')
zhangsan.sayName()

其实这就是个闭包,所以相对安全。

Thanks for Reading.....