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+xml自动生成表格的东西
Dec 21 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
js实现简单的左右两边固定广告效果实例
Apr 10 Javascript
jQuery CSS3相结合实现时钟插件
Jan 08 Javascript
基于jQuery实现的无刷新表格分页实例
Feb 17 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
Dec 02 Javascript
详解在vue-cli项目中安装node-sass
Jun 21 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
Sep 11 Javascript
vue将时间戳转换成自定义时间格式的方法
Mar 02 Javascript
详解puppeteer使用代理
Dec 27 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
Feb 15 jQuery
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 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
javascript 小型动画组件与实现代码
2010/06/02 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python 字典(Dictionary)操作详解
2014/03/11 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
Tesserocr库的正确安装方式
2018/10/19 Python
Python 获取div标签中的文字实例
2018/12/20 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
收银出纳员岗位职责
2014/02/23 职场文书
入股合作协议书
2014/10/12 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
思想道德自我评价2015
2015/03/09 职场文书
房产证明范本
2015/06/19 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
生活小常识广播稿
2015/08/19 职场文书
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL