面向对象的JavaScript

近期,在做学校内部的小项目中,觉得自己的水平并没有得到很大的提升以及看到自己本身的局限性。所以特去图书馆借了几本关于JavaScript的书继续深造,其中就有

《Pro JavaScript Development》

并希望通过借博客这个平台记录自己的成长过程,且希望能以此激励自己。

JavaScript中公有、私有以及受保护的属性和方法:

//我们将“类”的定义包在一个自我执行的函数里,这个函数返回我们所创建的“类”
//并将其保存在一个变量中以便在后面的代码使用
var accommodation = (function(){
    //定义“类”的构造函数。因为处在一个新的函数内,我们也切换到了一个新的作用域中,
    //所以可以使用与保存函数返回值的那个变量相同的名字
    function accommodation(){}

    var _isLocked = false,
        _isAlarmed = false,
        _alarmMessage = "Alarm activated!";
    //仅在当前作用域中定义的函数(而未在构造函数的原型上定义)也都是“私有的”
    function _alarm(){
        _isAlarmed = true;
        console.log(_alarmMessage);
    }
    function _disableAlarm(){
        _isAlarmded = false;
    }
    //所有定义在原型上的方法都是“公有的”,当我们在此处创建的“类”在闭包结束处被返回后,就可以
    //在当前作用域之外访问这些方法了
    accommodation.prototype.lock = function(){
        _isLocked = true;
        _alarm();
    };
    accommodation.prototype.unlock = function(){
        _isLocked = false;
        _disableAlarm();
    };
    //定义个getter函数来对私有变量_isLocked的值进行只读访问——相当于把变量定义为了“受保护的”
    accommodation.prototype.getIsLocked = function(){
        return _isLocked;
    };
    //定义一个setter函数来对私有变量_alarmMessage进行只写访问——相当于将其定义为了“受保护的”
    accommodation.prototype.setAlarmMessage = function(message){
        _alarmMessage = message;
    };
    //返回在这个作用域中创建的“类”,使之在外层作用域中即后面代码的所有位置都可用。只有公有的
    //属性和方法是可用的
    return accommodation;
}());
//创建一个对象实例
var house = new accommodation();
house.lock();//输出警告消息“Alarm activated”

try{
    house._alarm();//
}
catch(error){
    console.log(error + ":错误!_alarm函数从未被公开暴露,所以无法直接通过“类”的对象实例进行访问");
}
console.log(house.isLocked);//undefined(_isLocked是私有的。在闭包外部访问不到)

house.getIsLocked();//true

house.setAlarmMessage("The alarm is now activated!");
house.lock();

猜你喜欢

转载自blog.csdn.net/Char_n/article/details/70231846
今日推荐