23_面向对象程序设计(原型【六】原型对象的常用开发模式

    原型对象虽然可以对所有实例的属性和方法共享,但是它的局限性也是很明显的,正是因为共享的特性,也导致原型存在的最大问题。

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


你可能感兴趣的:(原型对象的常用开发模式)