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 相关文章推荐
event.X和event.clientX的区别分析
Oct 06 Javascript
JQuery AJAX 中文乱码问题解决
Jun 05 Javascript
JS读取XML文件示例代码
Nov 15 Javascript
异步动态加载JS并运行(示例代码)
Dec 13 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
Nov 03 Javascript
jQuery进行组件开发完整实例
Dec 15 Javascript
JS函数定义方式的区别介绍
Mar 22 Javascript
原生JavaScript制作计算器
Oct 16 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
Jul 06 Javascript
解决layui轮播图有数据不显示的情况
Sep 16 Javascript
vue2路由基本用法实例分析
Mar 06 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
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一些公用函数的集合
2008/03/27 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
angularjs实现table增加tr的方法
2018/02/27 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
js常见遍历操作小结
2019/06/06 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
Python 字典中的所有方法及用法
2020/06/10 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
县政协领导班子群众路线教育实践活动四风问题整改方案
2014/10/26 职场文书
上下班时间调整通知
2015/04/23 职场文书
倡议书格式及范文
2015/04/29 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书