JavaScript面向对象系列:六、对象模式(一)

前言

js有很多创建对象的模式,完成工作的方式也不是只有一种。可以随时定义自己的类型和自己的泛用对象。可以使用继承或者混入等其他技术令对象间行为共享。也可以利用js高级技巧来组织对象结构被改变。

私有成员和特权成员

js对象对象的所有属性都是公有的,且没有显式的方法指定某个属性不能被外界某个对象访问。然而,有时候可能不希望数据公有。

模块模式

模块模式是一种拥有私有数据的单件对象的模式。基本做法就是使用立即调用函数表达式(IIFE)来返回一个对象。IIFE是一种被定义后立即调用并产生结果的函数表达式,该函数表达可以包括任意数量的本地变量,它们在函数外不可见。因为返回的对象被定义在函数内部,对象的方法可以访问这些数据。(IIFE定义的所有对象都可以访问通用的本地变量)以这种方式访问私有数据的方法被称为特权方法。

基本格式如下

var yourObject = (function(){
//私有数据

return {
//公有方法和属性
};
})();

IIFE是js中一种很流行的模式,部分原因就是模块模式中的应用。

模块模式允许使用普通变量作为非公有对象属性。通过创建必报函数作为对象方法来操作它们。闭包函数就是一个可以访问其作用域外部数据的普通函数。

例如

var person = (function (){
var age = 25;

return {
name:"laowang",
getAge:function(){
return age;
},
growOlder:function(){
age++;
}
};
})();

console.log(person.name); //"laowang"
console.log(person.getAge()); //25

person.age = 100;
console.log(person.getAge()); //25

person.growOlder();
console.log(person.getAge()); //26

模块模式还有一个变种叫暴露模块模式,它将所有的变量和方法都组织在IIFE的顶部,然后将它们设置到需要被返回的对象上。可以使用暴露模块模式改写上面的例子。

例如

var person = (function (){
var age = 25;

function getAge(){
return age;
}

function growOlder(){
age++;
}

return {
name:"laowang",
getAge:getAge,
growOlder:growOlder
};
})();

console.log(person.name); //"laowang"
console.log(person.getAge()); //25

person.age = 100;
console.log(person.getAge()); //25

person.growOlder();
console.log(person.getAge()); //26

发表评论

电子邮件地址不会被公开。 必填项已用*标注