• 面向对象与原型2


    原型模式创建对象也有自己的缺点,它省略了构造函数传参初始化这一过程,带来的缺
    点就是初始化的值都是一致的。而原型最大的缺点就是它最大的优点,那就是共享。
    原型中所有属性是被很多实例共享的,共享对于函数非常合适,对于包含基本值的属性
    也还可以。但如果属性包含引用类型,就存在一定的问题:(传参

    //原型的缺点
    function
    Box() {}; Box.prototype = { constructor : Box, name : 'Lee', age : 100, family : ['父亲', '母亲', '妹妹'], //添加了一个数组属性 run : function () { return this.name + this.age + this.family; } }; var box1 = new Box();
    box1.family.push('哥哥'); //在实例中添加'哥哥'//在第一个修改后引用类型,保持了共享
    alert(box1.run());
    var box2 = new Box();
    alert(box2.run()); //共享带来的麻烦,也有'哥哥'了//共享了box1添加后的引用类型的原型

    PS:数据共享的缘故,导致很多开发者放弃使用原型,因为每次实例化出的数据需要保留自己的特性,而不能共享。

    五、组合构造函数+原型模式

    function Box(name, age) { //不共享的使用构造函数
      this.name = name;
      this.age = age;
      this.family = ['父亲', '母亲', '妹妹'];
    };
    Box.prototype = { //共享的使用原型模式
      constructor : Box,
      run : function () {
        return this.name + this.age + this.family;
      }
    };var box1 = new Box();

    var box1 = new Box('Lee', 100);
    //alert(box1.run());
    alert(box1.family);
    box1.family.push('弟弟');        
    alert(box1.family);

    var box2 = new Box('Jack', 200);
    //alert(box2.run());
    alert(box2.family);                    //引用类型没有使用原型,所以没有共享

    原型模式,不管你是否调用了原型中的共享方法,它都会初始化原型中的方法,并且在
    声明一个对象时,构造函数+原型部分让人感觉又很怪异,最好就是把构造函数和原型封装
    到一起。为了解决这个问题,我们可以使用动态原型模式。--封装

    六、动态原型模型

    当第一次调用构造函数时,run()方法发现不存在,然后初始化原型。当第二次调用,就
    不会初始化,并且第二次创建新对象,原型也不会再初始化了。这样及得到了封装,又实现
    了原型方法共享,并且属性都保持独立。

    //可以将原型封装到构造函数里
    function Box(name, age) {        
        this.name = name;
        this.age = age;
        this.family = ['哥哥','姐姐','妹妹'];
        
        if (typeof this.run != 'function') {                //判断this.run是否存在
            Box.prototype.run = function() {
                return this.name + this.age + '运行中...'
            };
        }
    }
    
    //原型的初始化,只要第一次初始化,就可以了,没必要每次构造函数实例化的时候都初始化
    
    var box1 = new Box('Lee', 100);
    var box2 = new Box('Jack', 200);

    PS:使用动态原型模式,要注意一点,不可以再使用字面量的方式重写原型,因为会
    切断实例和新原型之间的联系。

    七、寄生构造函数,其实就是工厂模式+构造函数模式

    //寄生构造函数 = 工厂模式 + 构造函数
    
    function Box(name, age) {
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.run = function () {
            return this.name + this.age + '运行中...'
        };
        return obj;
    }
    
    
    var box1 = new Box('Lee', 100);
    alert(box1.run());
    
    var box2 = new Box('Jack', 200);
    alert(box2.run());

    八、稳妥构造函数

    在一些安全的环境中,比如禁止使用this 和new这里的this 是构造函数里不使用this,
    这里的new 是在外部实例化构造函数时不使用new。这种创建方式叫做稳妥构造函数

    function Box(name, age) {
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.run = function () {
            return this.name + this.age + '运行中...'
        };
        return obj;
    }
    
    
    var box1 = Box('Lee', 100);
    alert(box1.run());
    
    var box2 = Box('Jack', 200);
    alert(box2.run());
    本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji
  • 相关阅读:
    Winfrom Chart实现数据统计
    Python--面向过程编程
    老板喜欢什么样的员工
    python--装饰器
    python--浅拷贝和深拷贝
    Python基础-logging模块
    Python基础-subprocess模块
    Python基础-hashlib模块
    Python基础-ConfigParser模块
    Python基础-XML模块
  • 原文地址:https://www.cnblogs.com/laugh/p/4358358.html
Copyright © 2020-2023  润新知