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.穩妥構造函數模式
摘自 晴天漫步