zoukankan      html  css  js  c++  java
  • 《javascript设计模式》读书笔记二(封装和隐藏信息)

    1.为什么要封装和信息隐藏


    做过编程的朋友们知道“耦合”这个词。事实上封装的效果就是为了解耦,让类和类之间没有太多的联系,防止某一天改动某一类的时候,产生“多米骨诺牌效应”。

    我们能够把信息隐藏看成目的,把封装看成达到信息隐藏的技术。

    通过封装就能够把对象的内部数据表现形式和实现细节进行隐藏。就好比你会看电视,可是你不知道电视的内部结构一样。

    可是在javascript中没有不论什么内置的机制。所以我们还需做些处理,相同来模仿封装。

     

    2.创建对象的方法


    1)最简单的一种方法就是门户大开型对象。用一个函数来作为其构造器。所谓的门户大开就是他的全部的属性和方法都是公开的。相当于我们经经常使用的keyword“public”。


    <span style="font-family:SimSun;font-size:18px;"> <script>
            //定义一个book的类,function承担了构造函数的工作
            var Book = function (name, title, author) {
                this.name = name;//书名
                this.title = title;//标题
                this.author = author;//作者
            }
            //实例化一个book1对象
            var book1 = new Book("语文");
            alert(book1.name);
        </script></span>

    这是一种最简单的创建对象的方式。可是它还是无法做到隐藏对象内部的信息。想想看我们在其它编程语言中是怎样创建对象的呢?


    2)vb.net中创建属性对象


    <span style="font-family:SimSun;font-size:18px;">'定义一个Book类
    Public Class Book
        Dim book As String   '书名
        Dim title As String   '标题
        Dim author As String   '作者
        ''' <summary>
        ''' 得到书名
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Property GetBook() As String
            Get
                Return book
    
            End Get
            Set(value As String)
                book = value
    
            End Set
        End Property
        ''' <summary>
        ''' 返回title
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Property GetTitle() As String
            Get
                Return title
    
            End Get
            Set(value As String)
                title = value
    
            End Set
        End Property
    
        ''' <summary>
        ''' 获取作者
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Property GetAuthor() As String
            Get
                Return author
    
            End Get
            Set(value As String)
                author = value
            End Set
        End Property
    
    End Class
    </span>





    3.利用闭包模仿VB.NET构造函数


    1)看了上述VB.NET的代码。事实上我们也能够在javascript去模仿实现,还是上述的操作,定义一个Book类。关于这个类有三个属性,假设你仅仅想得到的话,能够仅仅简单的设置一个get方法。为了区分私有和公有成员,能够在方法和属性名称前加下划线来区分。


    <span style="font-family:SimSun;font-size:18px;"> </span><pre class="javascript" name="code"><span style="font-family:SimSun;font-size:18px;">//定义一个book的类,function承担了构造函数的工作
            var Book = function (name) {
                this._name = name;//书名
                //通过一个内嵌函数,来实现外部的函数可以訪问到内部的私有变量
                this._GetName = function () {
                    return this._name;
                }
                this._SetName = function (value) {
                    this._name=value
                }
            }
            //实例化一个book1对象
            var book1 = new Book("语文");
            alert(book1._GetName());//正确
            book1._SetName("数学");
            alert(book1._GetName());//正确
            alert(_name);//错误操作
            alert("");
    </span>

    
    
    <span style="font-family:SimSun;font-size:18px;">这就是一个简单的闭包,通过内嵌函数来返回外层函数的私有变量,从而即封装了内部函数的私有变量又能够訪问的到。

    有关于闭包的知识,能够看我先前的博客。</span>


    2)以上的操作还能够通过原型对象的操作来实现。


    <span style="font-family:SimSun;font-size:18px;"><script>
            //定义一个book的类,function承担了构造函数的工作
            var Book = function (name) {
                this._name = name;//书名
                //通过一个内嵌函数。来实现外部的函数可以訪问到内部的私有变量
              
            }
            //通过原型对象来设置訪问对象的私有属性
            Book.prototype = {
                _GetName: function () {
                    return this._name;
                },
                _SetName: function (value) {
                    this._name = value;
                }
            }
            //实例化一个book1对象
            var book1 = new Book("语文");
            alert(book1._GetName());//正确
            book1._SetName("数学");
            alert(book1._GetName());//正确
            alert(_name);//错误操作
            alert("");
        </script></span>


    3)两种方法对照


    能够看到通过上述两种操作都能够封装不论什么对象的私有属性。话又说回来,这两种操作又有什么不同呢?

    这就涉及到有关原型对象的知识,本节仅仅是单纯的实现怎样封装隐藏信息,不会在展开讨论。

    至于把全部的方法都创建到原型对象中,就会无论生成对少对象实例。这些方法在内存中仅仅会存在一份,方法都共用。而还有一个则不同,没生成一个对象。没调用一个方法,都会占用一份内存。比方说上述的样例中创建了5个Book对象。用样例一中的_GetName方法的话。每一个对象都会占用一份内存,而用原型对象创建的话。五个Book对象共用一份内存,这就是他们最本质的差别。

    假设用原型对象创建的方法,在实例化Book1的时候,运行方法时,先从本对象開始寻找,假设找到则停止,未找到则会转移到原型对象方法中寻找。这也是为何创建的对象能够共享原型对象方法的本质。

    demo

     function Person(name, sex) {
    
                this.name = name;
    
                this.sex = sex;
    
            }
    
            Person.prototype.age = 20;
    
            var zhang = new Person("ZhangSan", "man");
    
            console.log(zhang.age); // 20
    
            // 覆盖prototype中的age属性
    
            zhang.age = 19;
    
            console.log(zhang.age); // 19
    
            delete zhang.age;
    
            // 在删除实例属性age后,此属性值又从prototype中获取
    
            console.log(zhang.age); // 20


    4.小结


    以上就是在javascript中模仿构造函数创建对象的方法,事实上与其它语言对照来说,很的简单。仅仅只是涉及到了一些“闭包”的知识,假设用过其它语言的话,那么你就会很掌握的。


  • 相关阅读:
    【python 待做】
    【python 第13日】网络通信socket socketserver
    【python第11日】自动生成项目目录 安全插入本文件夹下文件,即使别人引用也可以
    【python 第12日】 except异常
    【python 第10日】打飞机的小游戏 pygame
    【python 第9日】上下文 类装饰器 元类 属性描述符扩展
    Python(2.7)-字符串
    Python(2.7)-字典(dict)
    Python(2.7)-列表(list)
    mysql linux centos yum 安装
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6876504.html
Copyright © 2011-2022 走看看