1、通过new object方法或者字面量的方式创造对象
var obj = new Object()var obj1 = {}
缺点:创造多个key同,value不同的对象的时候会产生大量的重复代码(重复的书写key=value)
2、工厂模式
function CreateObj(...arg){ let obj = new Object() let attrs = ['a','b','c'] attrs.forEach((attr,index)=> { obj[attr] = arg[index] || null }); return obj }
缺点:无法解决对象的识别问题(x.constructor === Object,x为工厂模式创建出来的对象)
3、构造函数模式(无法复用属性)与原型模式 (属性共享)
4、组合构造函数+原型模式
function People(name){ this.name = name}People.prototype.say = function(){ return 'hello'}
5、动态原型模式(更好的封装,把所有属性都放在一个方法内部)
function People(name,fn){ if(fn&& typeof fn !== 'function')throw 'fn must be a function' this.name = name if(!fn){ People.prototype.say = function(){ return 'hello' } }else{ this.say = fn }}
6、Object.create(_pro_)
7、寄生构造函数(和工厂模式一样,只是调用方式上存在差异,就是在其他构造函数上的一个扩展,个人觉得没啥用)
function MyArray(){ let ary = new Array() ary.test = function(){ alert(ary[0]||'没有值') } return ary}let myarry = new MyArray()myarry.test()
8、稳妥构造函数(内部不能使用this,私有属性不能定义在对象上,只能定义在方法内部,调用时不能用new)
function Student(name){ let obj = new Object() let name = name //这里不能写为obj.name = name obj.sayName = function(){ return name } return obj}let stu1 = Student('zale')