JS面向对象-创建对象

本篇主要是「JavaScript高级程序设计-面向对象的程序设计」一章中第二篇「创建对象」回顾的笔记

工厂模式

  1. 根据所接受的参数构建一个包含所有必要信息的对象。

  2. 示例

    function createPerson(name, age, job) {
      var o = new Object();
      o.name = name;
      o.age = age;
      o.job = job;
      o.sayName = function() {
        alert(this.name);
      }
      return o;
    }
    
    var person = createPerson('Matthew', 27, 'Software Engineer');
    

构造函数模式

  1. 特点:

    • 没有显式地创建对象
    • 直接将属性和方法赋给this对象
    • 没有return语句
  2. 示例

    function Person(name, age, obj) {
      this.name = name;
      this.age = age;
      this.job = job;
      this.sayName = function() {
        alert(this.name);
      }
    }
    
    var person = new Person('Matthew', 27, 'Software Engineer')
    
  3. 问题:

    • 每个方法都要在每个示例上重新创建一遍
    • 会导致不同的作用域链和标识符解析

原型模式

  1. 好处:

    • 可以让所有对象实例共享它所包含的属性和方法
  2. 示例

    function Person(){}
    Person.prototype.name = 'Matthew';
    Person.prototype.age = 29;
    Person.prototype.job = 'Software Engineer';
    Person.prototype.sayName = function() {
      alert(this.name);
    }
    
    var person = new Person();
    person.sayName();
    
    // 另一种
    function Person(){}
    Person.prototype = {
      name: 'Matthew',
      age: 27,
      job: 'Software Engineer',
      sayName: function() {
        alert(this.name);
      }
    }
    
  3. 问题:

    • 不方便
    • 所有的属性都是共享的,不能隐藏属性

组合使用构造函数模式和原型模式

  1. 特点:

    • 最常见的方式
    • 每个实例都会有自己的一份实例属性的副本,同时又共享着对方法的引用,最大限度节省内存
    • 支持构造函数传递参数
  2. 示例

    function Person(name, age, job) {
      this.name = name;
      this.age = age;
      this.job = job;
    }
    
    Person.prototype = {
      constructor: Person,
      sayName: function() {
        alert(this.name);
      }
    }
    
    var person = new Person('Matthew', 27, 'Software Engineer');
    

动态原型模式

  1. 特点:

    • 把所有信息封装在构造函数中,通过在构造函数中初始化原型,又保持了同时使用构造函数和原型的有点
  2. 示例

    function Person(name, age, job) {
    	// 属性  
      this.name = name;
      this.age = age;
      this.job = job;
      
      // 方法
      if(typeof this.sayName != 'function') {
        Person.prototype.sayName = function() {
          alert(this.name);
        }
      }
    }
    

寄生构造函数模式

  1. 基本思想

    • 创建一个函数,作用仅仅是封装创建对象的代码
    • 再返回新创建的对象
  2. 示例

    function Person(name, age, job) {
      var o = new Object();
      o.name = name;
      o.age = age;
      o.job = job;
      o.sayName = function() {
        alert(this.name);
      }
      return o;
    }
    

稳妥构造函数模式

  1. 特点:

    • 没有公共属性

    • 适合在一些安全的环境中,或者在防止数据被其他应用程序改动时使用

  2. 示例:

    function Person(name, age, job) {
      var o = new Object();
      o.sayName = function() {
        alert(name);
      }
      return o;
    }