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。
JavaScript 面向對象的程序設計記錄筆記2(設計模式)