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']
  • 相关阅读:
    zrep 0.9 发布,zfs文件系统复制和故障转移
    Silverlight实例教程 Out of Browser开篇
    Silverlight Analytics Framework(开源分析框架)
    让你的Silverlight程序部署在任意服务器上
    Silverlight 4简体中文正式版脱机帮助文档下载
    Silverlight实例教程 Out of Browser存取本地文件系统
    Silverlight获取子控件和父控件方法
    轻松创建Silverlight 4开发环境
    Silverlight 4新控件PivotViewer介绍
    Silverlight实例教程 Out of Browser配置,安装和卸载
  • 原文地址:https://www.cnblogs.com/marunzhou/p/5804812.html
Copyright © 2011-2022 走看看