您的位置:首页 > Web前端 > JavaScript

JS模拟私有属性和方法

2018-01-22 11:13 134 查看

模拟私有属性和方法

概述

我们知道,在JS中,是没有明确定义私有属性或私有方法的语法的,通常约定在属性和方法前加下划线来告知开发者这是一个私有的属性或变量,如果需要创造出私有属性、方法,则需要一些小技巧。 在JS中,分为全局作用域和函数作用域,在函数内定义的属性和方法,都只能在当前函数内被访问到,在外部不能被访问,所以简单来说,在函数内部定义的属性和方法,都可以成为私有的。 当然,我们还可以提供一些公有的属性、方法(或者叫特权方法)去访问私有的属性和方法,但是常规来讲,既然属性、方法已经被私有,怎么还能让他被公有方法所访问?答案是:闭包。闭包的定义在此不做阐述,直接看例子。
var Animal = (
function() {
function Animal(age) {
this.age = age;
}
/*
这里有两个私有属性和一个私有方法,分别用下划线做标识。
*/
_climb = true;
_name = '动物';
function _canClimb() {
if (_climb) {
console.log(_name + '会爬树');
} else {
console.log(_name + '不会爬树');
}
}

Animal.prototype.eat = function() {
console.log('吃饭');
};
/*
在函数的原型上,访问私有方法或属性。
这里可以访问是因为在这个匿名函数的作用域内定义的方法是可以访问到当前函数作用域内的所有属性和方法的。
通过设置set get函数,来访问这些私有属性、方法。如果不提供set get函数,则私有属性、方法就不会被外部所访问到。
*/
Animal.prototype.isCanClimb = function() {
_canClimb();
};

Animal.prototype.setClimb = function(value) {
_climb = value;
};

Animal.prototype.getClimb = function() {
console.log(_climb);
};

Animal.prototype.setName = function(value) {
_name = value;
};
Animal.prototype.getName = function() {
console.log(_name);
};
return Animal;
}
)();

var cat = new Animal(24);
cat.isCanClimb(); // 动物会爬树
cat.setName('猫咪');
cat.isCanClimb(); // 猫咪会爬树
cat.setClimb(false);
cat.isCanClimb(); // 猫咪不会爬树
/* 上面的例子是通过构造函数的方式创建 下面的例子是普通对象创建私有属性、方法 */
var transformers = (
function() {
/*
私有方法和属性,外部不能直接访问
可以通过setget函数访问
*/
var _hideSkill = '变身';
function _transform() {
console.log('开始'+ _hideSkill);
}

return {
name: '变形金刚',
fly: function() {
console.log('开始飞');
},
transform: function() {
_transform();
},
setHideSkill: function(value) {
_hideSkill = value;
},
getHideSkill: function() {
return _hideSkill;
}

}
}
)();
详情关注博客 https://mmmaming.github.io/[/code] 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息