原型对象虽然可以对所有实例的属性和方法共享,但是它的局限性也是很明显的,正是因为共享的特性,也导致原型存在的最大问题。
function Person(){ } Person.prototype = { constructor: Person, name : "z3", age : 20, job : "程序员", friends : ["李四", "王五"], sayName : function(){ console.info("我是原型中的方法!"); } }; var p1 = new Person(); var p2 = new Person(); console.info(p1.friends); //李四, 王五 console.info(p2.friends); //李四, 王五 p1.friends.push("赵六"); console.info(p1.friends); //李四, 王五, 赵六 console.info(p2.friends); //李四, 王五, 赵六
我们一般组合使用构造函数式和原型模式,在实际开发中,这种模式也是应用的最为广泛。
//组合使用原型和构造函数式(定义一个类,开发时常使用)
//在构造函数中定义属性,在原型中定义方法
function Person(name, age, friends, job){ this.name = name; this.age = age; this.friends = friends; this.job = job; } Person.prototype = { constructor: Person, sayName : function(){ console.info(this.name); } }; var p1 = new Person("z3", 20, ["王五", "赵六"], "技术总监"); var p2 = new Person("李四", 25, ["王五", "赵六", "赵七"], "boss"); console.info(p1.friends); //王五, 赵六 console.info(p2.friends); //王五, 赵六, 赵七 p1.sayName(); //z3 p2.sayName(); //李四 p1.friends.push("aa"); console.info(p1.friends); //王五, 赵六, aa console.info(p2.friends); //王五, 赵六, 赵七
动态原型模式:就是把信息都封装到函数中,这样体现了封装的概念。所谓动态原型模板简单来说就是把构造函数和原型对象封装在一块。
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(){ console.info(this.name); } } } var p1 = new Person("z3", 20, ["王五", "赵六"], "技术总监"); var p2 = new Person("李四", 25, ["王五", "赵六", "赵七"], "boss"); console.info(p1.friends); console.info(p2.friends); p1.sayName(); p2.sayName(); p1.friends.push("aa"); console.info(p1.friends); console.info(p2.friends);
稳妥构造函数式:所谓稳妥模式就是没有公共属性,而且其他方法也不引用this对象,稳妥模式最适合在安全的环境中使用。如果你的程序对于安全性要求很高,那么非常适合这种模式。
//稳妥构造函数式:durable object(稳妥对象) 适用于要求非常安全的环境中 一般较少使用
//1、没有公共属性 2、不能使用this对象
function Person(name, age, job){ //创建一个要返回的对象 var obj = new Object(); //可以定义一些私有的变量和函数 var _name = name; var _sex = "男"; var _saySex = function(){ }; obj.sayName = function(){ alert(_name); } obj.getSex = function(){ return _sex; } obj.setSex = function(sex){ _sex = sex; } return obj; } var p1 = new Person("张三"); p1.setSex("男"); alert(p1.getSex()); p1.sayName(); alert(p1.constructor); //object