javascript 高级编程系列 - 创建对象
1. 工厂模式 ( 通过工厂函数封装构造对象的细节)
1 function createPerson(name, age) 2 { 3 var obj = {}; 4 obj.name = name; 5 obj.age = age; 6 obj.getName = function(){ 7 return this.name; 8 }; 9 return obj; 10 } 11 12 var person = createPerson('leon', 30);
2. 构造函数模式 (生成的实例对象和构造函数建立了类型关系)
1 function Person(name, age) 2 { 3 this.name = name; 4 this.age = age; 5 this.getName = function(){ 6 return this.name; 7 }; 8 } 9 10 var person = new Person('leon', 30 );
3. 原型模式 (多个对象实例之间共享属性值和方法)
1 function Person(){ 2 3 } 4 5 Person.prototype = { 6 constructor: Person, 7 name: 'leon', 8 age: 30, 9 getName: function(){ 10 return this.name; 11 } 12 }; 13 14 var person = new Person();
4. 组合构造函数和原型模式 (构造函数模式与原型模式的结合,属性在构造函数中进行定义,方法在原型中定义)
1 function Person(name, age) 2 { 3 this.name = name; 4 this.age = age; 5 } 6 7 Person.prototype = { 8 constructor: Person, 9 getName : function(){ 10 return this.name; 11 } 12 }; 13 14 var person = new Person('leon', 30 );
5.动态原型模式 (原型模式的改进为了更好的体现封装)
1 function Person(name, age) 2 { 3 this.name = name; 4 this.age = age; 5 if( typeof this.getName != 'function'){ 6 Person.prototype.getName = function(){ 7 return this.name; 8 } 9 } 10 }
6. 寄生构造函数模式 (工厂模式与构造函数的结合)
1 function Person(name, age) 2 { 3 var obj = {}; 4 obj.name = name; 5 obj.age = age; 6 obj.getName = function(){ 7 return this.name; 8 }; 9 return obj; 10 } 11 12 var person = new Person('leon', 30);
7. 稳妥构造函数模式 (工厂模式的安全版,无公共属性,方法中无this引用)
1 function Person(name, age) 2 { 3 var obj = {}; 4 var name = name; 5 var age = age;
6 obj.getName = function(){ 7 return name; 8 }; 9 return obj; 10 } 11 12 var person = Person('leon', 30);
8. 克隆模式 (基于已有对象创建新对象)
const person = { name: 'leon', age: '38', };
// 以现有对象作为原型创建新对象 const obj = Object.create(person);
// 将指定对象的原型设置为另一个对象
const obj = Object.setPrototypeOf({}, person);
// 将现有对象自有可枚举属性复制到新对象中
const obj = Object.assign({}, person);