javascript繼承(二)—建立對象的三種模式 javascript中類的屬性研究

1、工廠模式
function createPerson(name,age){
    var o = {};
    o.name = name;
    o.age = age;
    o.sayHi = function(){
        alert('my name is' + this.name);
    };
    return o;
}
var p1 = createPerson('小明',10);
var p2 = createPerson('小紅',9);
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Object
console.log(p2.constructor); //Object
 
工廠模式能夠建立多個對象,可是並不知道對象的類型,由於都指向了Object
2、構造函數模式
function Person(name,age){
    this.name = name;
    this.age = age;
    this.sayHi = function(){
        alert('my name is' + this.name);
    }; 
}
var p1 = new Person('小明',10);
var p2 = new Person('小紅',9); 
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Person(name,age)
console.log(p2.constructor); //Person(name,age)
console.log(p1.sayHi==p2.sayHi);//false

p1的sayHi方法和p2的sayHi方法是不一樣的,說明每new一個對象就會建立一個sayHi方法,其實這徹底不必,也會浪費空間。javascript

固然代碼能夠改寫以下:
function Person(name,age){
    this.name = name;
    this.age = age;
    this.sayHi = sayHi;
}
function sayHi(){
alert('my name is' + this.name);
}
var p1 = new Person('小明',10);
var p2 = new Person('小紅',9);
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Person(name,age)
console.log(p2.constructor); //Person(name,age)
console.log(p1.sayHi==p2.sayHi);//true

這時它們方法所指向的代碼塊就相同,即共用了一個方法。但其實沒有必要爲了一個類的特權方法就建立一個全局的方法,也會使得這個類顯得比較凌亂。html

第3、原型鏈模式
function Person(name,age){
    this.name = name;
    this.age = age;
}
Person.prototype.sayHi =function(){
    alert('my name is' + this.name);
}
var p1 = new Person('小明',10);
var p2 = new Person('小紅',9);
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Person(name,age)
console.log(p2.constructor); //Person(name,age)
console.log(p1.sayHi==p2.sayHi);//true

對於原型鏈來建立對象,能夠看到對象引用的方法是同一個方法,即類的共有方法。這樣極大的節約了代碼空間,不會每new一個對象就就類的全部方法建立一遍。java

對於對象的特權屬性、方法和共有屬性、方法在javascript中類的屬性研究 這篇文章中有所介紹。函數

相關文章
相關標籤/搜索