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 相关文章推荐
jQuery代码优化之基本事件
Nov 01 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
Jun 14 Javascript
js返回上一页并刷新代码整理
Dec 21 Javascript
原生js实现日期联动
Jan 12 Javascript
javascript实现获取服务器时间
May 19 Javascript
Node.js 应用跑得更快 10 个技巧
Apr 03 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
Dec 23 Javascript
JS实现图片预加载之无序预加载功能代码
May 12 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
Sep 22 jQuery
jquery实现选项卡切换代码实例
May 14 jQuery
前端天气插件tpwidget使用方法详解
Jun 24 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 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实现的随机广告显示代码
2007/06/14 PHP
php+javascript的日历控件
2009/11/19 PHP
PHP与MySQL开发的8个技巧小结
2010/12/17 PHP
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
PHP实现变色验证码实例
2014/01/06 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
2017/04/22 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
详解Python中的正则表达式的用法
2015/04/09 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python 中Pickle库的使用详解
2018/02/24 Python
python抽取指定url页面的title方法
2018/05/11 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
利用Python计算KS的实例详解
2020/03/03 Python
英国健身超市:Fitness Superstore
2019/06/17 全球购物
幼儿园元旦亲子活动方案
2014/02/17 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫