如何理解JavaScript语言精粹中的函数化模式
怪我咯
怪我咯 2017-04-11 12:53:11
0
1
344

蝴蝶书里面在讨论继承时提到了三种方式,第一种是用伪类的方式,通过new关键字来生成新的对象从而继承;第二种则是Object.create。这两种都相对好理解。而作者提到的第三种,函数化模式,在方法的最后写了这样一段话:“

如果对象的所有状态都是私有的,那么该对象就成为一个“防伪(tamper-proof)”对象。该对象的属性可以被替换或删除,但该对象的完整性不会受到损害。如果我们用函数化的样式创建一个对象,并且该对象的所有方法都不使用this或that,那么该对象就是持久性(durable)的。一个持久性对象就是一个简单功能函数的集合。一个持久性的对象不会被入侵。防伪一个持久性的对象时,除非用方法授权,否则攻击者不能访问对象的内部状态。

请问状态私有怎么理解,这段话具体想要表达怎样的意思?

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(1)
洪涛

按我理解

  • 私有状态 -> 私有字段

  • 对象的完整性不会受到损害 -> 对象的所有自身状态都是私有状态,就算所有公共接口被篡改了,对象本身的状态依然是完整的

  • 持久性 -> 静态对象

  • 一个持久性对象就是一个简单功能函数的集合 -> 即工具函数


私有字段

私有字段仅有该对象中的成员能够访问,不能通过其它方式访问

在 C# 中:

/// 声明了一个类 Season
class Season
{
    private int _month = 1;
    //这里 private 声明了一个整数类型的私有字段,只能通过内部提供的两个方法(NextMonth() 和 ToString())访问,在外界不能通过其它方法访问,这里即 Season 对象的 "状态"
    
    /// 这个函数让时间进行到下一个月,外部可访问, 支持链式调用
    public Season ChangeToNextMonth()
    {
        this._month = this._month >= 12 ? 1 : this._month + 1;
        return this;
    }

    /// 返回表示季节的字符串,外部可访问
    override string ToString()
    {
        switch(this._month)
        {
            case 1:
            case 2:
            case 3:
                return "春";
            case 4:
            case 5:
            case 6:
                return "夏";
            case 7:
            case 8:
            case 9:
                return "秋";
            default:
                return "冬";
        }
    }
}
Class Program{
    ///这里是程序的入口
    public static void Main()
    {
        var s = new Season();
        
        //s._month = 3;
        // 出错 这里没有权限直接访问 _month ,不能 "篡改对象本身的状态"
        
        Console.WriteLine(s.ChangeToNextMonth().ToString());
        //这里通过提供的两种方法间接的访问 _month 字段
    }
}

用 javascript 可以模拟上述特性:

这里使用 ES5 的语法

function Season(){
    var _month = 1;
    //这里的 _month 使用了闭包的特性,确保只能通过 nextMonth 和 toString 两个方法才能访问,其它方式不能访问

    this.changeToNextMonth= function () {
        _month = _month >= 12 ? 1 : _month + 1;
        return this;
    }

    this.toString = function () {
        switch (_month) {
            case 1:
            case 2:
            case 3:
                return "春";
            case 4:
            case 5:
            case 6:
                return "夏";
            case 7:
            case 8:
            case 9:
                return "秋";
            default:
                return "冬";
        }
    }
}

var s = new Season();
        
//s._month = 3;
// 出错 这里不能直接访问到 _month ,不能 "篡改对象本身的状态"
        
console.log(s.changeToNextMonth().toString());
//这里通过提供的两种方法间接的访问 _month 字段
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!