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 相关文章推荐
很全的显示阴历(农历)日期的js代码
Jan 01 Javascript
javascript中的if语句使用介绍
Nov 20 Javascript
input禁止键盘及中文输入,但可以点击
Feb 13 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
JavaScript实现的链表数据结构实例
Apr 02 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
Nov 30 Javascript
js实现PC端根据IP定位当前城市地理位置
Feb 22 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
Vue表单控件数据绑定方法详解
Feb 05 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
Aug 06 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
Feb 08 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中如何判断AJAX提交的数据
2012/02/05 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
JAVASCRIPT HashTable
2007/01/22 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
jquery实现图片按比例缩放示例
2014/07/01 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python编写Windows Service服务程序
2018/01/04 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
竞聘上岗演讲稿范文
2014/01/10 职场文书
运动会广播稿80字
2014/01/23 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
诚信承诺书
2015/01/19 职场文书
世界遗产导游词
2015/02/13 职场文书
三八妇女节致辞
2015/07/31 职场文书
户外拓展训练感想
2015/08/07 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python