JavaScript 面向对象的程序设计记录笔记2(设计模式)

以下为JavaScript高级程序设计 第六章面向对象的程序设计6.2节 创建对象(设计模式部分)读书记录。

1)工厂模式:

  function createPerson(name, age, sex) {

    var o = new Obejct();

    o.age = age;

    o.sex = sex;

    o.name = name;

    return o;
  }

  var person = createPerson('Tom', 12, 'male');

  var person = createPerson('Josn', 23, 'male');

  通过改方式,可无数次调用createPerson方法,传入三个参数,即可返回包含三个属性的对象。

2)构造函数方式:

  function Person(name, age, sex) {

    this.name = name;

    this.age = age;

    this.sex = sex;

    this.seyName = function(){

      alert(this.name);

    }

  }

  var person1 = new Person('Tom', 23, 'male');

  var person2 = new Person('Json', 23, 'male');

  构造函数方式存在缺陷: 每次每个对象上的方法都会被实力化一次,即创建person1对象的时候,会实例化一次sayName对象,创建person2对象的时候,又会创建一次sayName对象,两次sayName对象不同。即:

  console.log(person1.sayName == person2.sayName) ; // 输出false

3) 原型模式:(详见JavaScript高级程序设计第三版P147 - P158)

  每个创建的函数上都有一个prototype(原型)属性, 这个属性是一个指针,指向一个对象,而指向的对象是包含由特定类型的所有实例共享的属性和方法

   function Person(){}

  Person.prototype.name = 'Tom';

  Person.prototype.age = 24;

  Person.protoType.sayName = function(){alert(this.name)};

  var pserson1 = new Person();

  person1.sayName(); // Tom

  var person2 = new Person();

  person2.sayName(); // Tom

  console.log(person1.sayName == person2.sayName) ; // true

  通过原型模式创建的对象,所有的对象都共用一个prototype属性指定的对象。

    检验对象见是否存在Protptype关系,可用isPrototypeOf()方法,如果存在则返回true, 如:

  console.log(Person.prototype.isPrototypeOf(person1)); // true

  通过Object.getPrototypeOf()方法可返回指向原型对象的值,如:

  console.log(Object.getPrototypeOf(person1.name)); // 输出Tom

  注:每当代码读取某个对象的属性时,都会执行一次搜索,目标是具有给定名字的属性,首先从对象实例本身开始搜索,如果实例中存在具体给定的名字的属性,则返回改属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中找到了具体的给定值,则返回该属性的值。 也就是说在person1.sayName()的时候,会先后执行两次搜索,首先解释器会问?person1实例对象中是否存在sayName属性,答:没有,则继续搜索,指针指向的原型对象中进行搜索,解释器问?存在sayName属性嘛?答:存在,于是就读取存在原型对象中的函数。

  当实例对象中存在的属性名与原型中存在的属性一致的时候,原型中对应的属性值会被屏蔽,如:

  function Person(){}

  Person.prototype.name = 'Tom';

  Person.prototype.age = 24;

  Person.protptype.sayName = function(){alert(this.name);};

  var person1 = new Person();

  person1.name = 'Json';

  var person2 = new Person();

  console.log(person1.name); // Json

  console.log(person2.name); // Tom

  注:delete操作符可删除对象实例上的属性,从而获得原型上的属性,如:

  delete person1.name;

  console.log(person1.name); // 输出Tom

  hasOwnProperty()方法可判断一个属性是否存在实例对象中还是在原型中,如调用以上Person demo:

  console.log(person1.hasOwnProperty('name')); // false, 来自原型;

  person1.name = 'Tom';

  console.log(person1.hasOwnProperty('name')); // true, 来自实例

  与hasOwnProperty()方法有区别的操作符in, 只要对象上存在该属性,不关属性是来自实例的,还是来自原型的,都会返回true。

    

原文地址:https://www.cnblogs.com/lzj0824/p/6953339.html