@创建对象
##原生创建方法
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();
和工厂方法的区别在于变量私有,只能通过闭包访问。保证了安全性。