面向对象的程序设计

Thursday, August 15, 2019

第六章 面向对象的程序设计

6.2 创建对象

6.2.1 工厂模式

    1. 工厂模式
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 person1 = createPerson('Uzi', '21', 'loler')

person1.sayName()
  • 缺点:不知道对象的类型

6.2.2 构造函数模式

-

    1. 构造函数模式
  function  Person(name,age,job) {

  this.name = name;

  this.age = age;

  this.job = job;

  this.sayName =  sayName;

  }

  function sayName() {

  alert(this.name);

  }

  var person = **new**  Person("Uzi","21","loler");

  person.sayName();

-

  • 用 new 操作符创建的函数就可以作为构造函数,没有用 new 创建的函数则和普通函数没有什么区别。

  • 避免实例多个相同功能的 function,可以定义在外,但这也就失去了封装的意义。

  • 构造函数模式可以检测类型 person instanceof Person // true

6.2.3 原型模式

    1. 原型模式
    1. 创建每个函数都有一个原型(peototype)属性,该属性是指针,指向一个对象,包含特定类型的所有实例共享的属性和方法;
  • Person.prototype.name = “Tom”;

    1. 所有原型都有一个 constructor 对象,指向构造函数。

    2. 实例是与原型对象连接,而不是和构造函数连接;

    3. 寻找属性和方法先从实例开始搜寻,没有则继续在原型中搜寻;

    4. delete 可以删除实例属性 delete.person1.name;

    5. in 操作符在能访问到指定属性时返回 true,hasOwnProtperty 方法,属性在实例中才返回 true;

      1. return !object.hasOwnProperty(name)&&(name in Object); 原型属性则返回 true
    6. Object.keys(Person.prototype)返回所有可枚举属性的字符串数组;

    7. Object.getOwnPeropertyNames(Person.prototype)无论是否可枚举均返回字符串数组

    8. 简单的语法

Person.prototype = {
    name: 'Tom',

    age: '17',

    sayName: function () {},
}

11.

    1. 上面的写法重写了 prototype 对象,因此 constructor 也改变了,指向了 object 构造函数,需要手动改回 constructor:Person,
    2. 先创建了实例再重写 Prototype 会切断实例与新原型间的联系
    3. 不建议修改原生对象的原型
    4. 原型对象的缺点,比如数组,在实例中 push,会直接在原型中修改;

6.2.4/5/6/7

  1. 组合使用构造函数模式和原型模式
  2. 动态原型模式
  3. 寄生构造函数模式
  4. 稳妥构造函数模式