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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
js 获取Listbox选择的值的代码
Apr 15 Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 Javascript
通过百度地图获取公交线路的站点坐标的js代码
May 11 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
Jan 03 Javascript
JavaScript获得页面base标签中url的方法
Apr 03 Javascript
Backbone.js的Hello World程序实例
Jun 19 Javascript
jquery日历插件e-calendar升级版
Nov 10 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
Angular2入门教程之模块和组件详解
May 28 Javascript
vue watch监听对象及对应值的变化详解
Feb 24 Javascript
JS数组扁平化、去重、排序操作实例详解
Feb 24 Javascript
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 文件上传实例代码
2012/04/19 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
DataFrame中的object转换成float的方法
2018/04/10 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
物业管理专业自荐信
2014/07/01 职场文书
经典演讲稿开场白
2014/08/25 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技