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 相关文章推荐
超级有用的13个基于jQuery的内容滚动插件和教程
Jul 31 Javascript
基于jquery的无限级联下拉框js插件
Oct 29 Javascript
JavaScript—window对象使用示例
Dec 09 Javascript
浅析Node.js查找字符串功能
Sep 03 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
Feb 27 Javascript
AngularJS表单验证中级篇(3)
Sep 28 Javascript
Angularjs 创建可复用组件实例代码
Oct 09 Javascript
详解JS-- 浮点数运算处理
Nov 28 Javascript
如何重置vue打印变量的显示方式
Dec 06 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
vue实现评论列表功能
Oct 25 Javascript
JavaScript实现手风琴效果
Feb 18 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学习笔记之 函数声明(二)
2011/06/09 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
selenium+python 对输入框的输入处理方法
2018/10/11 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
python中提高pip install速度
2020/02/14 Python
PageFactory设计模式基于python实现
2020/04/14 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
解决python运行效率不高的问题
2020/07/20 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
彪马法国官网:PUMA法国
2019/12/15 全球购物
二年级体育教学反思
2014/01/15 职场文书
社团活动总结范文
2014/04/26 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
运动会表扬稿
2015/01/16 职场文书
拾金不昧感谢信
2015/01/21 职场文书
常住证明范本
2015/06/23 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书