原型对象虽然可以对所有实例的属性和方法共享,但是它的局限性也是很明显的,这是因为共享的特性,也导致原型存在的最大问题,原型里的属性和方法会被所有对象所共享: 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();