原型對象雖然可以對所有實例的屬性和方法共享,但是它的侷限性也是很明顯的,這是因爲共享的特性,也導致原型存在的最大問題,原型裏的屬性和方法會被所有對象所共享: 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();