1.私有变量
function myObject() {
var privateVariable = 10;
function privateFun() {
return false;
}
this.publicMethod = function() {
privateVariable++;
return privateFun();
};
}
function Person(name) {
this.getName = function() {
return name;
};
this.setName = function(value) {
name = value;
};
}
var p = new Person("Kitty");
p.getName();
p.setName("haha");
p.getName();
缺点:仅仅使用构造函数,导致多个实例,对应多个方法,方法不能重用,从而用静态私有变量进行改进
2.静态私有变量
(function() {
var privateVariable = 10;
function privateFun() {
return false;
}
// 构造函数
myObject = function() {
};
myObject.prototype.publicMethod = function() {
privateVariable++;
return privateFun();
}
})();
(function() {
var name = "";
Person = function(value) {
name = value;
};
Person.prototype.setName = function(value) {
name = value;
}
Person.prototype.getName = function() {
return name;
}
})();
// 在这个例子中,Person构造函数与getName()和setName()方法一样,都有权访问私有变量name,在这种模式下,变量name就变成了一个静态的、由所有实例共享的属性
以这种方式创建静态私有变量会因为使用原型而增进代码服用,但每个实例都没有自己的私有变量。到底是使用实例变量,还是静态私有变量,最终还要视具体需求而定;
3.模块模式: 为单例创建私有变量和特权方法(即访问私有变量的方法) 单例:只有一个实例对象,JS中的单例用对象字面量来表示
var singleton = function() {
var privateVariable = 10;
function privateFun() {
return false;
}
return { // 返回的对象字面量中只包含可以公开的属性和方法
publicProperty: privateVariable,
publicMethod: function() {
privateVariable++;
return privateFun();
}
};
}();
singleton
这种模式在需要对单例进行某些初始化,同时又需要维护其私有变量时是非常有用的
4.增强模块模式:模块实例+单例必须是某种类型的实例
var singleton = function() {
var privateVariable = 10;
function privateFun() {
return false;
}
// 创建对象
var object = new customType(); // customType为一个对象类型, 暂且用new Object()代替
object.publicProperty = privateVariable;
object.publicMethod = function() {
privateVariable++;
return privateFun();
};
return object;
}();