zoukankan      html  css  js  c++  java
  • 创建对象的多种方式

    // 1. 工厂模式
    //缺点:对象无法识别,因为原型都指向Object
    function pe() {
        var o = new Object();
        o.name = name;
        o.getname = function() {
            console.log(this.name)
        }
        return o
    }
    
    
    // 2. 构造函数模式
    // 优点:实例可以识别为一个特定的类型
    // 缺点:每次创建实例每个方法都要被创建一次
    function Person(name) {
        this.name = name;
        this.getName = function() {
            console.log(this.name);
        };
    
    }
    var person = new Person('zhansan');
    
    // 2.1 构造函数模式优化
    // 优点:解决了每个方法都要被重新创建的问题
    // 缺点:这叫啥封装……
    function Person(name) {
        this.name = name;
        this.getName = getName;
    
    }
    
    function getName() {
        console.log(this.name);
    }
    var person = new Person('zhansan');
    
    // 3. 原型模式
    // 优点:方法不会重新创建
    // 缺点:1. 所有的属性和方法都共享 2. 不能初始化参数
    function Person(name) {
    
    };
    Person.prototype.name = 'keivn';
    Person.prototype.getName = function() {
        console.log(this.name);
    };
    
    var person1 = new Person();
    
    // 3.1 原型模式优化
    // 优点:封装性好了一点
    // 缺点:重写了原型,丢失了constructor属性
    function Person(name) {
    
    };
    Person.prototype = {
        name: 'kevin',
        getName: function() {
            console.log(this.name);
        }
    };
    
    var person1 = new Person();
    
    // 3.2 原型模式优化
    // 优点:实例可以通过constructor属性找到所属构造函数
    // 缺点:原型模式该有的缺点还是有
    function Person(name) {
    
    }
    
    Person.prototype = {
        constructor: Person,
        name: 'kevin',
        getName: function() {
            console.log(this.name);
        }
    };
    
    var person1 = new Person();
    
    
    // 4. 组合模式
    // 优点:该共享的共享,该私有的私有,使用最广泛的方式
    // 缺点:有的人就是希望全部写在一起,即更好的封装性
    function Person(name) {
        this.name = name;
    }
    
    Person.prototype = {
        constructor: Person,
        getName: function() {
            console.log(this.name);
        }
    };
    
    var person1 = new Person();
    
    // 4.1 动态原型模式
    // 注意:使用动态原型模式时,不能用对象字面量重写原型
    function Person(name) {
        this.name = name;
        if (typeof this.getName != "function") {
            Person.prototype.getName = function() {
                console.log(this.name);
            }
        }
    }
    
    var person1 = new Person();
    // 如果你就是想用字面量方式写代码,可以尝试下这种:
    function Person(name) {
        this.name = name;
        if (typeof this.getName != "function") {
            Person.prototype = {
                constructor: Person,
                getName: function() {
                    console.log(this.name);
                }
            }
    
            return new Person(name);
        }
    }
    
    var person1 = new Person('kevin');
    var person2 = new Person('daisy');
    

      

  • 相关阅读:
    DOS命令
    利用cmd合并文件
    Word文档编辑
    初识Java
    变量、数据类型、运算符-2
    设计模式之策略模式
    设计模式之装饰者模式
    第18章 java I/O系统(3)
    第18章 java I/O系统(2)
    第四章 栈与队列3 (堆栈的应用)
  • 原文地址:https://www.cnblogs.com/xzma/p/7987931.html
Copyright © 2011-2022 走看看