一、经过new object方法或者字面量的方式创造对象函数
var obj = new Object() var obj1 = {}
缺点:创造多个key同,value不一样的对象的时候会产生大量的重复代码(重复的书写key=value)this
二、工厂模式spa
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为工厂模式建立出来的对象)prototype
三、构造函数模式(没法复用属性)与原型模式 (属性共享)code
四、组合构造函数+原型模式对象
function People(name){ this.name = name } People.prototype.say = function(){ return 'hello' }
五、动态原型模式(更好的封装,把全部属性都放在一个方法内部)blog
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 } }
六、Object.create(_pro_)原型
七、寄生构造函数(和工厂模式同样,只是调用方式上存在差别,就是在其余构造函数上的一个扩展,我的以为没啥用)io
function MyArray(){ let ary = new Array() ary.test = function(){ alert(ary[0]||'没有值') } return ary } let myarry = new MyArray() myarry.test()
八、稳妥构造函数(内部不能使用this,私有属性不能定义在对象上,只能定义在方法内部,调用时不能用new)function
function Student(name){ let obj = new Object() let name = name //这里不能写为obj.name = name obj.sayName = function(){ return name } return obj } let stu1 = Student('zale')