javascript原型對象存在的問題(3)

原型對象雖然可以對所有實例的屬性和方法共享,但是它的侷限性也是很明顯的,這是因爲共享的特性,也導致原型存在的最大問題,原型裏的屬性和方法會被所有對象所共享: static。

function Person(){

}

Person.prototype = {
    constructor:Person , 
    name: 'z3' , 
    age:  20 , 
    job : '程序員' ,
    friends : ['李四','王五'] ,
    sayName : function(){alert('我的名字!')}
};  


var p1 = new Person();
var p2 = new Person();  

p1.friends.push('趙六');

alert(p1.friends); //李四,王五,趙六
alert(p2.friends); //李四,王五,趙六
alert(p1.sayName == p2.sayName); //true

因此,我們通常使用原型和構造函數式

function Person(name , age , friends , job){
    this.name = name ; 
    this.age  = age ; 
    this.friends = friends ;
    this.job = job ;
}

Person.prototype = {
    constructor: Person ,  //不考慮被遍歷的問題
    sayName : function(){
        alert(this.name);
    }
};

var p1 = new Person('z3' , 20 , ['王五','趙六'] , '技術總監');
var p2 = new Person('李四', 25 , ['王五','趙六' ,'趙7'] ,'boss');

alert(p1.friends);  //王五,趙六
p1.sayName();  //z3
alert(p2.friends); //王五,趙六,趙7
p2.sayName(); //李四

動態原型模式

就是把信息都封裝到函數中,這樣體現了封裝的概念

function Person(name , age , friends , job){
    this.name = name ; 
    this.age  = age ; 
    this.friends = friends ;
    this.job = job ;

    //動態原型方法:
    if( typeof this.sayName != 'function'){
        Person.prototype.sayName = function(){
            alert(this.name);
        };
    }
}

穩妥構造函數式

所謂穩妥模式就是沒有公共屬性,而且其他方法也不引用this對象,穩妥模式最適合在安全的環境中使用。如果你的程序對於安全性要求很高,那麼非常適合這種原型模式

function Person(name , age , job){
        // 創建一個要返回的對象
        var obj = new Object();
        //可以定義一下私有的變量和函數 private
        var name = name ; 
        //var sex = '男';
        //var saySex = function(){};
        //添加一個方法
        obj.sayName = function(){
            alert(name);
        }
        return obj ;                
}
var p1 = new Person('張三');
p1.sayName();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章