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');
    

      

  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/xzma/p/7987931.html
Copyright © 2011-2022 走看看