本文实例分析了JS常见构造模式。分享给大家供大家参考,具体如下:
1.工厂模式
没有解决对象识别的问题。因为函数内部使用了new Object来创建对象
这时候的constructor是Object,同时所有通过工厂模式返回的对象都是Object类型,所以instanceof
操作符没有意义
2.构造函数模式
构造函数相比工厂模式的优点在于能够正确的返回对象的类型,instanceof
返回正确的结果。缺点在于如果向上面那样,那么在每一个对象上面都要有一个sayName方法,而且这些sayName方法不是同一个Function实例,因为ECMAScript中函数是对象,因此每定义一个函数,也就是实例化了一个对象!
对上面的方法进行优化:
缺点:全局函数sayName只能被某个对象调用p1.sayName
,让全局函数名不副实;如果对象要定义很多方法,那么就要定义很多的全局函数,所以自定义的引用类型没有封装性可言
3.原型模式
(1)无法通过构造函数参数向原型属性动态传值,后果就是:没有个性,改变原型属性的值,所有的实例都会受到干扰!
(2)当原型属性的是引用类型的时候,如果在一个对象实例上修改属性,将会影响所有实例!
总之一句话:牵一发而动全身(包括属性和引用类型的值)是原型模式的特点。但是相比于构造函数类型,原型类型满足
4.构造函数原型模式
用构造函数定义个性,用原型模式定义共性
也可以对构造函数原型模式进行优化,就是常说的动态原型模式
5.寄生构造函数模式
除了使用new
操作符以外,和工厂设计模式是一模一样的!可以在特殊的情况下为对象创建构造函数,例如想用构造函数方式创建一个具有额外方法的特殊数组,因为不能直接修改Array的构造函数,因此可以用这个模式!
总之,寄生构造函数的特点就是:有点像java中的装饰模式!把原来的对象进行装饰,同时返回装饰后的对象!这里就是把Array对象进行了装饰!添加了toPipe的String
方法。缺点就是不能依赖instanceof
操作符确定对象类型了,因为和不再包装类里面创建的对象是一模一样的!
6. 稳妥构造函数模式
特点:没有公共属性,而且其方法也不引用this的对象,instanceof
失效。和寄生构造函数的不同在于不使用new
来构造函数,同时实例方法不引用this
。实际是闭包
感兴趣的朋友还可以使用在线HTML/CSS/JavaScript代码运行工具:测试运行上述js代码。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》及《》
希望本文所述对大家JavaScript程序设计有所帮助。