// 工厂函数模式 // 没法解决对象识别问题 function person0(name, age, job) { var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; return obj; } // --------------------------------------------------- // 构造函数模式 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; // 这个方法实例化时,会建立两次 this.sayName = function() { alert(this.name); }; } const person1 = new Person("test1", 19, "pig"); const person2 = new Person("test2", 19, "dog"); // --------------------------------------------------- // 原型模式 // 初始化时没法自定义属性 function Person1() {} Person1.prototype.name = "looyulong"; Person1.prototype.age = age; Person1.prototype.job = job; Person1.sayName = function() { alert(this.name); }; // --------------------------------------------------- // 组合构造函数模式 // 构造函数定义属性,原型模式定义方法 function Per(name, age, job) { this.name = name; this.age = age; this.job = job; } Per.prototype = { constructor: Per, sayName: function() { alert(this.name); } }; const per1 = new Per("test1", 19, "pig"); const per2 = new Per("test2", 19, "dog"); // --------------------------------------------------- // 动态构造模式 // 就是加了一个判断,判断原型上面是否有对应的方法 function Person2(name, age, job) { this.name = name; this.age = age; this.job = job; if (typeof this.sayName !== "function") { Person2.prototype.sayName = function() { alert(this.name); }; } } // --------------------------------------------------- // 寄生构造函数模式 // 在构造函数的内部返回一个对象,也就是new的时候返回一个对象 // 与工厂函数其实没有很大区别,只是在写法上,工厂函数建立对象须要执行一个函数 // 经过这种模式,能够达到和工厂函数相同的效果,可是倒是用new操做符调用的 function Person3(name, age, job) { var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; obj.sayName = function() { alert(this.name); alert(obj.name); }; return obj; } // --------------------------------------------------- // 稳妥构造函数模式 // 没有公共属性,没有公共属性,不用this // 由于有些环境没法是用this和new function Person4(name, age, job) { var obj = new Object(); obj.getName = function() { return name; }; obj.getAge = function() { return age; }; obj.getJob = function() { return job; }; obj.sayName = function() { alert(name); }; return obj; }