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);

 

posted @ 2017-04-01 01:23  箫笛  阅读(142)  评论(0编辑  收藏  举报