本文涉及的主题虽然很基础,在很多人眼里属于小伎俩,但在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 definedreturn 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高级程序设计》(第3版)
-《JavaScript面向对象精要》
-《Effective JavaScript》

  • Private Members in JavaScript
  • JavaScript private methods
  • AGAIN WITH THE MODULE PATTERN – REVEAL SOMETHING TO THE WORLD

转载于:https://www.cnblogs.com/wujie520303/p/4941228.html

js基础知识温习:Javascript中如何模拟私有方法相关推荐

  1. js基础知识温习:构造函数与原型

    构造函数 构造函数主要用于初始化新对象.按照惯例,构造函数名第一个字母都要大写. 构造函数有别于其它函数在于它使用new操作符来调用生成一个实例对象.换句话说,如果一个函数使用new操作符来调用,则将 ...

  2. js基础知识:es6中,当对象中的key名称为一个变量时,需要用`[]`括起来

    es6中,当对象中的key名称为一个变量时,需要用[]括起来

  3. 前端学习笔记(js基础知识)

    前端学习笔记(js基础知识) JavaScript 输出 JavaScript 数据类型 常见的HTML事件 DOM 冒泡与捕获 流程控制语句 for..in 计时器 let,var,const的区别 ...

  4. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

    js基础知识中的作用域和闭包 一.作用域 1.作用域.自由变量简介 (1)作用域定义 (2)作用域实例演示 (3)自由变量定义 (4)自由变量实例演示 2.作用域链简介 (1)作用域链定义 (2)作用 ...

  5. php插入js教程,JavaScript_JavaScript入门教程(2) JS基础知识,在什么地方插入 JavaScript  Ja - phpStudy...

    JavaScript入门教程(2) JS基础知识 在什么地方插入 JavaScript JavaScript 可以出现在 HTML 的任意地方.使用标记,你可以在 HTML 文档的任意地方插入 Jav ...

  6. JS基础知识学习(一)

    JS基础知识 前端开发常用的浏览器 谷歌浏览器(chrome):Webkit内核(v8引擎) 火狐浏览器(firefox):Gecko内核 欧朋浏览器(opera):Presto内核 IE浏览器:Tr ...

  7. (六)JS基础知识三(走进作用域和闭包)【三座大山之二,不会闭包,基本不会通过】

    JS基础知识三(作用域和闭包) 提问 作用域 自由变量 闭包 this 提问 this的不同应用场景,如何取值 手写bind函数 实际开发中闭包的应用场景,举例说明 创建10个a标签,点击的时候弹出对 ...

  8. Js基础知识梳理系列

    小序:总是感觉自己的技术一直在原地踏步,想学习一些新的技术,但学起来很吃力,而且总是没有什么实际的收获,似乎进入了所谓的"瓶颈期".问了一些前辈是否也遇到过同样的问题,他们给我的解 ...

  9. 【成长之路】JavaScript中,模拟 call 的底层实现

    很多人都说IT人员的黄金年龄在 35岁以下,过了保质期就会被淘汰,但是,事实真的是这样吗?我见过40岁以上的IT人员,他们并没有被这个行业所淘汰,相反,他们可以比年轻的IT人员拥有更高的工作效率,因为 ...

最新文章

  1. pythonpil库过滤图像contour_快乐python 零基础也能P图 —— PIL库
  2. 解决postgresql数据库localhost可以连接,ip连接不了的问题
  3. LeetCode Peeking Iterator
  4. 【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )
  5. C语言的实现经过(C代码到CPU执行)
  6. php 访问 sharepoint列表,SharePoint—用REST方式访问列表
  7. 【动态规划】方格取数 (ssl 1010)
  8. how to get the space size of some tables in one database?
  9. mysql 小雨_Mysql数据库
  10. 视觉SLAM笔记(46) 基本的 VO
  11. java中程序跳转_java程序中先后台交互的两种实现方式以及页面之间的跳转
  12. 把Python函数转换成能在SQL语句中调用的函数
  13. String s String s=null和String s=a区别
  14. leetcode 65. Valid Number
  15. 【校招VIP】知名产品分析之微信本身的亮点和缺点
  16. 无人驾驶中UTM坐标系GPS坐标系相关知识总结
  17. 一级建造师-通信-五种施工顺序-口诀
  18. 「Codeforces 335E」Counting Skyscrapers
  19. 计算机组成原理课程笔记
  20. levelup游戏资料库项目开发备忘录(10.26)

热门文章

  1. shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  2. oracle添加语句 commit,Oracle COMMIT语句
  3. flink集成springboot案例_Flink从流处理到流批一体的19个最佳实践
  4. spark 序列化错误 集群提交时_【问题解决】本地提交任务到Spark集群报错:Initial job has not accepted any resources...
  5. docker安装linux桌面系统,Hostwinds云主机 – Docker安装Xfce桌面环境(轻量可视化操作系统)...
  6. date数据类型的正确格式_说说数据类型 上篇日期
  7. 缓存成神路:Redis读写分离难以理解?一文解析Redis读写分离技术
  8. Python,OpenCV中的非局部均值去噪(Non-Local Means Denoising)
  9. Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)
  10. 【camera-radar】基于ROS的多传感器融合感知系统实现(雷达+相机)(1)