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 相关文章推荐
使用Modello编写JavaScript类
Dec 22 Javascript
JavaScript DOM 学习第五章 表单简介
Feb 19 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
Mar 04 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
Aug 16 Javascript
javascript  删除select中的所有option的实例
Sep 17 Javascript
如何检查一个对象是否为空
Apr 11 Javascript
JS 封装父页面子页面交互接口的实例代码
Jun 25 Javascript
Vue3 源码导读(推荐)
Oct 14 Javascript
JavaScript实现简单的计算器
Jan 16 Javascript
js实现超级玛丽小游戏
Mar 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查看session内容的函数
2008/08/27 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
注册页面之前先验证用户名是否存在的php代码
2012/07/14 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
PyCharm 常用快捷键和设置方法
2017/12/20 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
Python PIL库图片灰化处理
2020/04/07 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
教师自我评价范文
2013/12/16 职场文书
开业庆典答谢词
2014/01/18 职场文书
经典洗发水广告词
2014/03/13 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
工程款申请报告
2015/05/15 职场文书
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers