认识在js中的公有和私有变量
function car(){
var wheel = 3;//私有变量
this.wheel = 4;//公有变量
alert(wheel);
alert(this.wheel);
}
这里创建的都是私有变量 sum num1 num2
function sum(num1, num2) {
var sum = num1 + num2;
return sum;
}
我们怎么才能访问到函数内部的私有变量,怎么才能修改函数内部的私有变量。
下面我简单说下关于函数内部私有和公有变量的一些处理办法。
如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量,利用这一点,就可以创建用于访问私有变量的公用方法。
我们把有权访问私有变量和私有函数的公有方法叫做特权方法。
- 1.构造函数定义法
function myObject() {
//私有属性和私有函数
var privateVariable = 10;
function privateFunction() {
return privateVariable;
}
//特权方法
this.publicMethod = function() {
privateVariable++;
return privateFunction();
}
}
var object1 = new myObject();
//访问了函数内部的局部变量即私有变量
console.log(object1.publicMethod());
function Person(name) {
this.getName = function() {
return name;
};
this.setName = function(value) {
name = value;
};
}
//创建对象实例
var person = new Person("李雷");
console.log(person.getName());
person.setName("韩梅梅");
console.log(person.getName());
在以上构造函数中定义了两个特权方法:getName()和setName()。这两个方法都可以在函数外部使用,而且都有权访问私有变量name。
- 2.静态私有变量
通过在私有作用域中定义私有变量或函数,同样也可以创建特权方法
(function() {
//私有变量和私有函数
var privateVariable = 10;
function privareFunction() {
return false;
};
//构造函数
MyObject = function() {}
//公有、特权方法
MyObject.prototype.publicMethod = function() {
privateVariable++;
privareFunction();
}
})();
(function() {
var name = "";
Person = function(value) {
name = value;
};
//添加原型方法
Person.prototype.getName = function() {
return name;
};
Person.prototype.setName = function(value) {
name = value;
};
})();
var person1 = new Person("lilei");
console.log(person1.getName());
person1.setName("hanmeimei");
console.log(person1.getName());
var person2 = new Person("mahuateng");
console.log(person1.getName());
console.log(person2.getName());
- 3.模块模式
模块模式是为单例创建私有变量和特权方法,单例就是指,只有一个实例的对象。
var singlton = {
name: value,
method: function() {
//这是方法的代码
}
}
var singlton = function() {
//私有变量和私有函数
var privateVaiable = 10;
function privateMethod() {
return false;
};
//公有/特权方法
return {
publicProperty: true,
piblicMethod: function() {
privateVaiable++;
return privateMethod();
}
}
}();
function BaseComponent() {}
function OtherComponent() {}
var application = function() {
//私有变量和函数
var components = new Array();
//初始化
components.push(new BaseComponent());
//公有
return {
getComponentCount: function() {
return components.length;
},
registerComponent: function(component) {
if(typeof component == "object") {
components.push(component);
}
}
};
}();
application.registerComponent(new OtherComponent());
alert(application.getComponentCount()); //2
- 4.增强的模块模式
var singlton = function(){
//私有变量和私有函数
var privateVaiable = 10;
function privateMethod() {
return false;
};
//创建对象
var object = new CustomType();
//公有/特权方法
object.publicProperty = true;
object.piblicMethod = function() {
privateVaiable++;
return privateMethod();
};
//返回这个对象
return object;
}();
function BaseComponent() {}
function OtherComponent() {}
var application = function() {
//私有变量和私有函数
var components = new Array();
//创建对象
components.push(new BaseComponent());
//创建application的一个局部副本
var app = new BaseComponent();
//公共
app.getComponentCount = function() {
return components.length;
};
app.registerComponent = function(component) {
if(typeof component == "object") {
components.push(component);
}
};
//返回这个副本
return app;
}();
alert(application instanceof BaseComponent);
application.registerComponent(new OtherComponent());
alert(application.getComponentCount()); //2