zoukankan      html  css  js  c++  java
  • 模式学习小结[工厂模式|构造函数|原型模式]

    一直对工厂模式、构造函数及原型模式的定义有些模糊,今天抽了些时间学了下工厂模式、构造函数及原型模式的区别及用途,小结一番。

    一、工厂模式

    // 工厂模式
    function createPerson(name,age){
        var o = new Object();
            o.name = name;
            o.age  = age;
        return o;
    }
    var person1 = createPerson('one','20');
    var person2 = createPerson('two','10');

    作用:工厂模式可以快速创建类似的对象

    缺点:创建的对象不具有识别性,故此我们可以使用构造函来解决这个问题

    二、构造函数

      // 构造函数
        function Person(name,age){
            this.name = name;
            this.age = age;
            this.sayName = function(){
                alert(this.name);
            }
        }
        var person = new Person('mrz','26');

    实例化构造函数相比于普通的工厂模式,其多也constructor指向了Person()用以识别其他实例的构造函数。

    new Person()包含了四个步聚:

    ①创建一个新对象

    ②将构造函数的作用域赋给新对象(this指向新对象)

    ③执行构造函数

    ④返回新对象

    构造函数本身也可以直接执行,但是这样this就指向了window

    Person('mrz','26');
    //调用sayName 此时sayName已经定义到了Global
    window.sayName();     //mrz

    缺点:构造函数每次实例都会将函数内部的属性,全部复制给新对象,内部定义的函数也是多次实例化,造成不必要的浪费,故此应该将其公用部分复用,故此原型模式可以帮忙解决这一问题。

    三、原型模式

    // 原型模式
    function Person(){}
    Person.prototype = {
        name : 'mrz',
        age : '26',
        sayName : function(){
            alert(this.name);
        }
    }
    var person = new Person();

    new 原型,新对象的constructor将指向Person.prototype,获取Person.prototype上的属性,同时其本身也添加本身的实例属性,来获得本身实例所需的属性值。

    // 原型模式
    function Person(){}
    Person.prototype = {
        name : 'mrz',
        age : '26',
        sayName : function(){
            alert(this.name);
        }
    }
    var person = new Person();
    person.name = 'marz';

    原型模式也有一个比较大的问题,那就引用类型的数值,会被共用,一个对象操作会改变其他对象。

    // 原型模式
    function Person(){}
    Person.prototype = {
        name : 'mrz',
        age : '26',
        friend : ['one','two'],
        sayName : function(){
            alert(this.name);
        }
    }
    var person1 = new Person();
    var person2 = new Person();
    person1.friend.push('three');
    console.log(person2.friend);  //["one", "two", "three"]

    解决这个问题,可以让构造函数+原型模式结合解决。

    // 构造函数+原型模式
    function Person(){
        this.name = 'mrz';
        this.age = '26';
        this.friend = ['one','two'];
    }
    Person.prototype = {
        
        sayName : function(){
            alert(this.name);
        }
    }
    var person1 = new Person();
    var person2 = new Person();
    person1.friend.push('three');
    
    console.log(person1.friend); // ['one','two','three']
    console.log(person2.friend); // ['one','two']
  • 相关阅读:
    Snmpwalk
    本地使用PostMan测试接口没有问题,但是线上直接进不了接口
    redis使用注意事项
    线程笔记
    springboot笔记
    springboot中多个地址指向同一个方法
    开发过程中遇到的注解
    使用maven时用到的一些问题
    遇到线程安全问题的案例
    mongodb
  • 原文地址:https://www.cnblogs.com/marunzhou/p/5804812.html
Copyright © 2011-2022 走看看