1. 程式人生 > >JavaScript 面向對象的程序設計記錄筆記2(設計模式)

JavaScript 面向對象的程序設計記錄筆記2(設計模式)

程序 構造 方法 目標 代碼 構造函數 判斷 .get create

以下為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。

    

JavaScript 面向對象的程序設計記錄筆記2(設計模式)