js 创建对象的9种方式对比

@创建对象

##原生创建方法

new func();   
{};


##工厂模式

优点:原生创建方法的封装。

缺点:对象类型不可知。

function createFunc(args){… return obj;}
var obj=createFunc(args)

##构造函数模式

优点:对象类型可知(instanceof,obj.constructor)

缺点:构造了多个相同功能的方法。(可以通过this.func=window.func,但这样函数变全局,失去封装性)

function Func(args){this.prop…}
var obj=new Func(args);      ||      Func.call(obj,args);     ||     Func(args)  window.prop;…

##原型模式

优点:解决了构造函数缺点

缺点:默认属性相同,原型的引用型属性有坑,一个变全都变。

function Func(){}    Func.prototype.prop…        //Func.prototype={,…} Object.defineProperty(Func.prototype,constructor,{enumerable:false,value:Func})   重写原型更常用,但需在创建实例前定义原型,否则有坑
var obj=new Func();

##构造原型模式结合

优点:结合构造原型两家之长

缺点:不突出原型编程泛型的特点。

实例属性用构造,方法和共享属性用原型。

##原型克隆模式(推荐)

优点:显现出原型编程泛型的特点                       单页web应用p38

缺点:

var proto={};function makeFunc(){varobj=Object.create(proto);obj.prop=…; return obj;}
var obj=makeFunc();

不支持object.create()的浏览器可js实现

##动态原型构造

优点:和其他OO语言更接近。

缺点:不突出原型模式特点。

构造函数中动态初始化原型。

function Func(){this.prop=…;if(typeofthis.func!='function'){Func.prototype=function(){}} };
var obj=new Func();

确保原型方法只定义一次,if检测只需一次。(若重写原型会切断与原有实例的联系,原型模式同坑)

##寄生式构造

优点:可用于构造方法的重构。

缺点:对象类型不可知,此法少用。

function NewFunc(){var obj=new Func();obj.prop=…;return obj;}
var obj=new NewFunc();

##稳妥构造函数模式(不用this不用new)

优点:专用于安全执行环境,构造函数的变量只能通过get函数来获取。

缺点:对象类型不可知

function Func(){var obj=new Object();var_prop;obj.getProp(){};return obj; }
var obj=Func();

和工厂方法的区别在于变量私有,只能通过闭包访问。保证了安全性。



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值