js基础知识(公有方法、私有方法、特权方法)


Posted in Javascript onNovember 06, 2015

本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。

公有方法
公有方法就是能被外部访问并调用的方法。

// 在对象中
var Restaurant = {
 name: 'McDonald',
 // 公有方法
 getName: function() {
 return this.name;
 }
}

// 在构造函数中
function Person(name, age) {
 this.name = name;
 this.age = age;
 // 公有方法
 this.getName = function() {
 return this.name;
 }
}

// 在原型中
Person.prototype.getAge = function() {
 return this.age;
}

私有方法特权方法
这两个方法一般放在一起讨论,原因在于我们定义的特权方法是指有权访问内部私有属性和私有方法的公有方法,而私有方法是指外部不可见且不可访问的方法。

通常定义一个对象的方式有二种,一是使用Object实例化或者对象表达式,二是使用构造函数。同样在不同的方式下面定义私有方法和特权方法的形式也不相同。

在对象中
这里我们通过Object对象表达式来创建一个对象并添加一些属性和方法,然后直接采用静态的方式调用。对象的私有数据放置在一个匿名函数立即执行表达式(IIFE)中。这意味着这个函数只存在于被调用的瞬间,一旦执行后就立即被销毁了。

在对象中创建私有数据的方式在对象的模式(指创建对象的模式)中被称之为模块模式,它的基本格式如下:

var yourObject = (function() {

 // 私有属性和方法

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

在模块模式中,返回的对象字面量中只包含可以公开的属性和方法。

var Restaurant = (function() {
 // 私有属性
 var _total = 10;

 // 私有方法
 var _buyFood = function() {
 _total--;
 };
 var _getTotal = function() {
 return _total;
 }

 return {
 name: 'McDonald',
 getTotal: _getTotal,
 buy: _buyFood
 }
}) ();

Restaurant.buy();
console.log(Restaurant.name); // 'McDonald'
console.log(Restaurant.getTotal()); // 9

注意我们使用了闭包的方式来间接使用内部私有变量,同时对餐厅(Restaurant)名(name)进行了初始化。

在构造函数中
在上面介绍的模块模式创建私有方法时,公有方法和特权方法并没有什么本质上的区别,原因在于这个概念是来自于使用构造函数创建私有数据的时候定义出来的。

在构造函数中定义私有属性和方法很方便,我们不需要使用闭包,可以在调用的时候初始化数据。

function Restaurant(name) {
 // 私有属性
 var _total = 10;

 // 公有属性
 this.name = name;

 // 私有方法
 function _buyFood() {
 _total--;
 }

 // 特权方法
 this.buy = function() {
 _buyFood();
 }

 this.getTotal = function() {
 return _total;
 }
}

// 公有方法, 注意这里不能访问私有成员_total
Restaurant.prototype.getName = function() {
 console.log(_total); // Uncaught ReferenceError: _total is not defined
 return this.name;
}

var McDonald = new Restaurant('McDonald');
console.log(McDonald.getName()); // 'McDonald'
McDonald.buy();
console.log(McDonald.getTotal()); // 9

合二为一,更加灵活的方式
使用模块模式我们可以多次调用,每次执行完后都会被销毁掉。使用构造函数方式可以传入一些初始化的数据,但在公有方法中无法访问到私有成员属性,如果有很多公有方法需要访问私有数据,我们全部用特权方法来写,最后会给每个实例带去很多没有必要的方法。因此,将两者结合在一起可以长短互补,结合方式也很简单

var Restaurant = (function() {
 // 私有属性
 var _total = 10;

 // 私有方法
 function _buyFood() {
 _total--;
 }

 // 构造函数
 function restaurant(name) {
 this.name = name;
 this.getTotal = function() {
 return _total;
 }
 }

 restaurant.prototype.buy = function() {
 console.log(_total); // 10
 _buyFood();
 }

 restaurant.prototype.getName = function() {
 return this.name;
 }

 return restaurant;
}) ();

var McDonald = new Restaurant('McDonald');
console.log(McDonald.getName()); // 'McDonald'
McDonald.buy();
console.log(McDonald.getTotal()); // 9

以上就是本文的全部内容,小编只是总结了其中一小部分,还有许多未提及到的知识点,大家可以自己摸索研究,希望本文可以对初学者有所帮助。

Javascript 相关文章推荐
javascript 硬盘序列号+其它硬件信息
Dec 23 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
Apr 12 Javascript
JavaScript 中的日期和时间及表示标准介绍
Aug 21 Javascript
JavaScript让Textarea支持tab按键的方法
Jun 26 Javascript
JavaScript与HTML的结合方法详解
Nov 23 Javascript
终于实现了!精彩的jquery弹幕效果
Jul 18 Javascript
AngularJS ng-app 指令实例详解
Jul 30 Javascript
TypeScript学习之强制类型的转换
Dec 27 Javascript
js仿iphone秒表功能 计算平均数
Jan 11 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
May 13 Javascript
JS倒计时两种实现方式代码实例
Jul 27 Javascript
jQuery treeview树形结构应用
Mar 24 jQuery
JS实现的N多简单无缝滚动代码(包含图文效果)
Nov 06 #Javascript
javascript中的altKey 和 Event属性大全
Nov 06 #Javascript
JS日期加减,日期运算代码
Nov 05 #Javascript
程序员必知35个jQuery 代码片段
Nov 05 #Javascript
js如何实现淡入淡出效果
Nov 18 #Javascript
JavaScript数组去重的五种方法
Nov 05 #Javascript
javascript实现tab切换的两个实例
Nov 05 #Javascript
You might like
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
js密码强度检测
2016/01/07 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
视觉直观感受若干常用排序算法
2017/04/13 Python
Python中表示字符串的三种方法
2017/09/06 Python
python+opencv识别图片中的圆形
2020/03/25 Python
解决Python一行输出不显示的问题
2018/12/03 Python
python http基本验证方法
2018/12/26 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
中国高端家电购物商城:顺电
2018/03/04 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
区域销售经理岗位职责
2013/12/10 职场文书
奥利奥广告词
2014/03/20 职场文书
家长给学校的建议书
2014/05/15 职场文书
安全生产承诺书范文
2014/05/22 职场文书
抵押贷款承诺书
2014/05/30 职场文书
企业管理标语
2014/06/10 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
springboot如何初始化执行sql语句
2021/06/22 Java/Android
解决Oracle数据库用户密码过期
2022/05/11 Oracle