zoukankan      html  css  js  c++  java
  • 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。

        

  • 相关阅读:
    [HEOI2016/TJOI2016]求和——第二类斯特林数
    RMAN备份脚本
    CF724E Goods transportation
    RMAN备份脚本--DataGuard primary
    [CEOI2017]Mousetrap
    healthcheck
    [学习笔记]斯特林数
    database.sql
    HDU 4372 Count the Buildings——第一类斯特林数
    orac
  • 原文地址:https://www.cnblogs.com/lzj0824/p/6953339.html
Copyright © 2011-2022 走看看