Javascript 作用域使用说明


Posted in Javascript onAugust 13, 2009

公用、受保护和私有作用域

在传统的面向对象程序设计中,主要关注于公用和私有作用域。公用作用域中的对象属性可以从对象外部访问,即开发者创建对象的实例后,就可使用它的公用属性。而私有作用域中的属性只能在对象内部访问,即对于外部世界来说,这些属性并不存在。这也意味着如果类定义了私有属性和方法,则它的子类也不能访问这些属性和方法。

最近,另一种作用域流行起来,即受保护作用域。虽然在不同语言中,受保护作用域的应用的规则不同,但一般说来,它都用于定义私有的属性和方法,只是这些属性和方法还能被其子类访问。

对ECMAScript讨论这些作用域几乎毫无意义,因为ECMAScript中只存在一种作用域——公用作用域。ECMAScript中的所有对象的所有属性和方法都是公用的。因此,定义自己的类和对象时,必须格外小心。记住,所有属性和方法默认都是公用的。

许多开发者都在网上提出了有效的属性作用域模式,解决了ECMAScript的这种问题。由于缺少私有作用域,开发者们制定了一个规约,说明哪些属性和方法应该被看作私有的。这种规约规定在属性名前后加下划线。例如:

Javascript 作用域使用说明

这段代码中,属性color是私有的。记住,这些下划线并不改变这些属性是公用属性的事实,它只是告诉其他开发者,应该把该属性看作私有的。

有些开发者还喜欢用单下划线说明私有成员,例如obj._color。

静态作用域并非静态的

静态作用域定义的属性和方法任何时候都能从同一个位置访问。在Java中,类可具有静态属性和方法,无需实例化该类的对象,即可访问这些属性和方法,例如java.net.URLEncoder类,它的函数encode()即是静态方法。

严格说来,ECMAScript并没有静态作用域。不过,它可以给构造函数提供属性和方法。还记得吗,构造函数只是函数。函数是对象,对象可以有属性和方法。例如:

Javascript 作用域使用说明Javascript 作用域使用说明

Javascript 作用域使用说明

这里,方法alternate()实际上是函数sayHi的方法。可以像调用常规函数一样调用sayHi()输出"hi",也可以调用sayHi.alternate()输出"hola"。即使如此,alternate()也是sayHi()公用作用域中的方法,而不是静态方法。

Javascript 相关文章推荐
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
Dec 02 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
Jan 28 Javascript
js 控制图片大小核心讲解
Oct 09 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
动态更新highcharts数据的实现方法
May 28 Javascript
Vue中img的src属性绑定与static文件夹实例
May 18 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
Aug 04 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
基于javascript处理二进制图片流过程详解
Jun 08 Javascript
Javascript 继承机制实例
Aug 12 #Javascript
Javascript 继承机制的实现
Aug 12 #Javascript
Javascript 继承实现例子
Aug 12 #Javascript
JQuery jsonp 使用示例代码
Aug 12 #Javascript
JavaScript 权威指南(第四版) 读书笔记
Aug 11 #Javascript
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
Aug 09 #Javascript
javascript 当前日期加(天、周、月、年)
Aug 09 #Javascript
You might like
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
php之readdir函数用法实例
2014/11/13 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
详解js闭包
2014/09/02 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
Vue的生命周期操作示例
2019/09/17 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
python调用Delphi写的Dll代码示例
2017/12/05 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
python如何基于redis实现ip代理池
2020/01/17 Python
python中get和post有什么区别
2020/06/19 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
ddl,dml和dcl的含义
2016/05/08 面试题
工程技术负责人岗位职责
2015/04/13 职场文书
入党培养人考察意见
2015/06/08 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
virtualenv隔离Python环境的问题解析
2022/06/21 Python