对象(三)

1、原型的弊端

    function Person() {
    }
    Person.prototype = {
        constructor : Person,
        name : 'zs',
        age : 20,
        friends : ['王五','赵六']
    }
    var p1 = new Person();
    var p2 = new Person();
    p2.friends.push("xiao A");
    alert(p1.friends);          // 王五,赵六,xiao A
    alert(p2.friends);          // 王五,赵六,xiao A
    // 原型的属性和方法被所有的对象所共享

改进方法一  : 

2、组合原型和构造函数式

    function Person2(name, age, friends) {
        this.name = name;
        this.age = age;
        this.friends = friends;
    }
    Person2.prototype = {
        constructor : Person2,
        sayName : function () {
            alert(this.name);
        }
    }
    var p3 = new Person2("张三",20,["王五","赵六"]);
    var p4 = new Person2("李四",26,["王五","赵六","浅浅"])
    alert(p3.friends)           // 王五,赵六
    p3.sayName();               // 张三
    alert(p4.friends)           // 王五,赵六,浅浅
    p4.sayName();               // 李四

3、动态原型模式

    // 动态原型模式  (将代码都封装到一起)
    function Person3(name,age,friends) {
        this.name = name;
        this.age = age;
        this.friends = friends;
        if(typeof this.sayName != "function" ){
            Person3.prototype.sayName = function () {
                alert(this.name)
            }
        }
    }
    var p5 = new Person3("haha",20,['aa','bb']);
    var p6 = new Person3("heihei",22,['aa','bb','cc']);
    alert(p5.sayName == p6.sayName)             // true   说明 sayName 方法只被声明了一次

4、稳妥构造函数式

    // 稳妥构造函数式 (应用在非常安全的环境中)
    // 1、没有公共属性    2、不能使用 this 对象
    function Person4(name,age,job) {
        // 创建一个要返回的对象发
        var obj = new Object();
        // 创建一些属性,属性为私有属性,函数外不能访问
        var name = name;
        obj.sayName = function () {         // 函数里定义方法来访问函数内的属性
            alert(name);
        }
        return obj;
    }
    var p7 = new Person4("aa");
    p7.sayName();           // aa

 

posted @ 2017-11-08 15:56  linfang.zhou  阅读(184)  评论(0编辑  收藏  举报