javascript學習筆記(九)對象–設計模式

1.創建對象
  View Code
 
1 var person = new Object();
2 person.name = "RuiLiang";
3 person.age = 30;
4 person.job = "Teacher";
5 person.sayName = function () {
6     alert(this.name);
7 };
8
9 person.sayName();
 
2.工廠模式
缺點:不能識別對象
  View Code
 
 1 function createPerson(name,age,job) {
 2     var o = new Object();
 3     o.name = name;
 4     o.age = age;
 5     o.job = job;
 6     o.sayName =  function () {
 7     alert(this.name);
 8     };
 9     return o;
10 }
11
12 var person1 = createPerson("阿亮",30,"教師");
13 var person2 = createPerson("俊俊",24,"待業");
14
15 person1.sayName();        //"阿亮"
16 person2.sayName();        //“俊俊”
 
3.構造函數模式
缺點:缺少封裝性
  View Code
 
 1 function Person(name,age,job) {
 2     this.name = name;
 3     this.age = age;
 4     this.job = job;
 5     this.sayName = sayName;
 6 }
 7 function sayName() {
 8     alert(this.name);
 9 }
10
11 var person1 = new Person("阿亮",30,"教師");
12 var person2 = new Person("俊俊",24,"待業");
13 person1.sayName();
14 person2.sayName();
 
4.原型模式
缺點:所有屬性被實例共享
  View Code
 
1 function Person() {
2 }
3
4 Person.prototype.name = "ALiang";
5 Person.prototype.age = 30;
6 Person.prototype.job = "Teacher";
7 Person.sayName = function () {
8     alert(this.name);
9 }
 
hasOwnProperty()方法檢測某一屬性是不是實例屬性,如果是返回 true
person1.hasOwnProperty("name");        //name是不是person1的屬性
in 操作符:通過對象訪問的屬性是否存在,若存在返回 true,不管屬性存在實例中還是原型中
alert("name" in person1);        //name屬性若存在返回 true
確定屬性在原型中還是對象中的方法:
 
1 function hasPrototypeProperty(object,name) {
2     return !object.hasOwnProperty(name) && (name in object);
3 }
4 //用法
5 var person = new Person();
6 alert(hasPrototypeProperty(person,"name"));        //true
7 person.name = "Grey";        //改變原型中name的值
8 alert(hasPrototypeProperty(person,"name"));        //false
 
isPrototypeOf()方法是用來判斷指定對象object1是否存在於另一個對象object2的原型鏈中,是則返回true,否則返回false。
格式如下:
object1.isPrototypeOf(object2);
object1是一個對象的實例;
object2是另一個將要檢查其原型鏈的對象。
原型鏈可以用來在同一個對象類型的不同實例之間共享功能。
如果 object2 的原型鏈中包含object1,那麼 isPrototypeOf 方法返回 true。
如果 object2 不是一個對象或者 object1 沒有出現在 object2 中的原型鏈中,isPrototypeOf 方法將返回 false。
 
 1 //字面量重寫原型對象
 2 function Person(){
 3 }
 4
 5 Person.prototype = {
 6         constructor : Person,
 7         name : "ALiang",
 8         age : 30,
 9         job : "Teacher",
10         sayName : function() {
11             alert(this.name);
12         }
13 };
 
5.構造函數和原型混合模式
具有構造函數模式和原型模式的優點,屬性用構造函數模式,方法用原型模式    //這種模式使用最廣泛
  View Code
 
 1 function Person(name,age,job) {
 2     this.name = name;
 3     this.age = age;
 4     this.job = job;
 5     this.friends = ["xuyun","wuxueming"];
 6 }
 7 Person.prototype = {
 8     constructor : Person,
 9     sayName : function() {
10         alert(this.name);
11     }
12 };
13
14 var person1 = new Person("ALiang",30,"Teacher");
15 var person2 = new Person("ZuNan",26,"Teacher");
16 person1.friends.push("JunJun");
17 alert(person1.friends);        //"xuyun","wuxueming","JunJun"
18 alert(person2.friends);        //"xuyun","wuxueming"
 
6.動態原型模式
  View Code
 
 1 function Person(name,age,job) {
 2     this.name = name;
 3     this.age = age;
 4     this.job = job;
 5
 6     if (typeof this.sayName != "function"){                    //這裡的sayName可以是任何初始化後存在的方法或屬性
 7         Person.prototype.sayName = function() {            //不能用字面量形式
 8             alert(this.name);
 9         };
10     }
 
7.寄生構造函數模式
8.穩妥構造函數模式

 

 

摘自 晴天漫步

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *