JavaScript中的私有变量

JavaScript中的私有变量
很不好意思。Javascript中没有私有变量这一事实。
JavaScript中的所有对象属性都是公有的。我们在任何地方,可以通过
对象加成员访问符就可以访问我们的成员变量。虽然实际上没有私有变量,
但是我们可以提出一个私有变量的概念。什么是私有变量?只能在函数内部,
不可以在函数外部访问的变量。那么,这就引出一个事实:在函数内部
定义的变量在函数外部都是不可以访问的。因此,可以说在函数内部
定义的变量都是私有变量。


<html>
<head>
    <script type="text/javascript">
        function City() {
            var population = 2000;
            this.getPopulation = function() {
                return population;
            };
            
            this.setPopulation = function(data) {
                population = data;
            };
        }
        
        var city = new City();
        console.log(city.population);   //undifined
        console.log(city.getPopulation());  //2000

    </script>
</head>
<body></body>
</html>
能够在构造函数中定义特权方法,是因为特权方法作为闭包有权访问
在构造函数中定义的所有属性和方法。
每一个实例的变量都是副本,彼此互不干扰。
function City() {
var population = 2000;
this.getPopulation = function() {
return population;
};

this.setPopulation = function(data) {
population = data;
};
}


var wuhan = new City();
console.log(wuhan.population);          //undifined
console.log(wuhan.getPopulation());     //2000
var nanjing = new City();
nanjing.setPopulation(1000);
console.log(nanjing.getPopulation());   //1000
console.log(wuhan.getPopulation());     //2000
基于构造函数模式创建的实例,每一个实例都有同样的方法,其实这个方法完全可以公用。


================================================================================
静态私有成员
静态成员:这个成员不为实例所有,而为所有实例公有。或者说,不是实例成员而是类成员。
私有成员:这个成员只能在函数内部访问,在函数外部不可以访问。
实现机制:首先采用私有机制(function(){...})(),那么在块级作用域里面定义的都是局部
成员,在块级作用域以外,不可见。块级作用域外部无法使用,那岂不是徒劳吗?注意初始化
未声明的变量是全局变量,所以Person是全局变量。故而能够在块级作用域外部使用。
其次:关于方法的问题,这里的getPassword和setPassword此时已经是原型的方法而不是实例
方法。所以为所有实例所共享。
   (function() {
var password = 123;

Person = function(pwd) {
password = pwd;
};

Person.prototype.getPassword = function() {
return password;
};

Person.prototype.setPassword = function(data) {
password = data;
}
})()
var person1 = new Person(123);
var person2 = new Person(456);
console.log(person1.getPassword());
console.log(person2.getPassword());
person1.setPassword(789);
console.log(person1.getPassword());
console.log(person2.getPassword());


=========================================================================
模块模式
模块模式是为单例创建私有变量和特权方法
注意了。是为单例创建,为单例,单例。
JavaScript以字面量的方式创建单例对象。
var application = function() {
   var components = new Array();
   components.push("wuhan");
   return {
   getComponent: function() {
   return components.pop();
   },


   addComponent: function(elem) {
   components.push(elem);
   }
   }
}
var result = application();
console.log(typeof result); //Object
console.log(result.getComponent());
result.addComponent("beijing");
console.log(result.getComponent());
对象字面量定义的是单例的公共接口。
适用场景:需要初始化,同时需要维护私有变量十分有用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值