zoukankan      html  css  js  c++  java
  • Object-Oriented(一)创建对象

    自用备忘笔记

    前言

    虽然可以使用 Object 和对象字面量创建对象,但是如果要创建大量相似的对象又显得麻烦。为解决这个问题,人们开始使用工厂模式的变种。

    工厂模式

    function person(name, age) {
        var o = new Object();
        o.name = name;
        o.age = age;
        o.sayName = function() {
            alert(this.name);
        };
        return o;
    }
    
    var person1 = person('Nicholas', 29),
        person2 = person('Greg', 27);

    优点:解决了创建多个相似对象的问题

    缺点:没有解决对象识别的问题,即不知道生成对象是什么类型。

     

    构造函数模式

    function Person(name, age) {
        this.name = name;
        this.age = age;
        this.sayName = function() {
            alert(this.name);
        };
    }
    
    var person1 = new Person('Nicholas', 29),
        person2 = new Person('Greg', 27);

    优点:解决了对象识别的问题,通过对象可以知道它是由哪个构造函数生成的。

    person1.constructor == Person  //true
    person1 instanceof Person //true
    person1 instanceof Object //true

    缺点:会在每个实例对象上生成方法,没有达到复用的效果。

    person1.sayName == person2.sayName; //false

    通过 new 操作符会经历以下 4 个步骤:1. 创建一个新对象;2. 将构造函数的作用域赋给新对象;3. 执行构造函数中的代码;4. 返回新对象。

    原型模式

    function Person() {}
    Person.prototype.name = 'Nicholas';
    Person.prototype.age = 29;
    Person.prototype.friends = ['Shelby', Court]; Person.prototype.sayName
    = function() { alert(this.name); }; var person1 = new Person();

    优点:原型对象上的属性和方法均可以复用。

    缺点:引用类型属性被共享,无法传参数自定义实例对象的属性。

    var person1 = new Person(),
        person2 = new Person();
    
    person1.friends.push('Van');
    
    console.log(person2.friends); //Shelby, Court, Van

    组合模式

    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    Person.prototype.sayName = function() {
        alert(this.name);
    };
    
    var person1 = new Person('Nicholas', 29);

    优点:集合了构造函数模式和原型模式的优点,是最广泛认可的模式。

    缺点:构造函数和原型对象的初始化分开书写,对有类概念语言的学习者不友好。

     

    动态原型模式

    function Person(name, age) {
        this.name = name;
        this.age = age;
        if (typeof this.sayName == 'function') return;
        Person.prototype.sayName = function() {
            alert(this.name);
        }
    }
    
    var person1 = new Person('Nicholas', 29);

    优点:将原型对象的初始化放入构造函数内部,是最理想的模式。通过检测(任一)方法是否存在,来避免重复对原型对象初始化。

     

    寄生构造函数模式

    function Person(name, age) {
        var o = new Object();
        o.name = name;
        o.age = age;
        o.sayName = function() {
            alert(this.name);
        };
        return o;
    }
    
    var person1 = new Person('Nicholas', 29);

    缺点:与工厂模式相似,只是通过 new 操作符调用构造函数。与工厂模式一样,无法解决对象识别的问题,不推荐使用。

     

    稳妥构造函数模式

    稳妥对象是指没有公共属性,而且方法也不引用 this 的对象。

    function Person(name, age) {
        var o = new Object();
        o.sayName = function() {
            alert(name);
        };
        return o;
    }
    
    var person1 = Person('Nicholas', 29);

    优点:适用于禁止使用 this 和 new 的场景,安全性高,适合某些安全要求高的环节;属性未绑定在实例对象上,只能通过特点方法访问。

    缺点:同样无法识别对象类型。

    参考:《高级程序设计(第3版)》

  • 相关阅读:
    剑指offer(链表)
    设计模式
    谷歌Colab使用(深度学习)
    Consul与python API注册与注销
    【日志收集】之Loki
    【消息队列】之 RabbitMQ安装
    【消息队列】之NSQ安装
    Docker基础
    Python3 , Mysql5.7 , Smb 安装
    SkyWalking部署
  • 原文地址:https://www.cnblogs.com/ghost-xyx/p/7902863.html
Copyright © 2011-2022 走看看