js确切的说是一种基于对象的语言,和纯面向对象的语言(比如as)稍微有点区别,js中没有类的概念。虽然有继承但是基于原型的继承。随着前段越来越受重视,jser们利用js的一些特性他们制造出了和纯面向对象一样好玩的东西。下面就js中一些概念进行概述,很多东西都是来自博客园的一些大牛,我写这篇文章主要想拿as和js做对比来讲,以方便as像转js的程序员们。本片文章涉及的概念有,模块,类,继承,私有属性和公开属性。

1.模块
大家写as的时候都知道,as里面是有类的概念,每次生成一个类,系统中都会多一个以.as结尾的文件,这个文件我们称为类文件,我们会将所有关于该类实现的属性方法放到这个文件中来写。那么js呢。在我看了很多大牛的博客后,了解到js也是可以分模块的。有两种写法。

  1. //module1.js
  2. 1).(function(namespace) {
  3. function log() {
  4. console.log('test');
  5. }
  6. namespace.run = function() {
  7. log();
  8. };
  9. })(window.module1 = window.module1 || {});
  10.  
  11. //module2.js
  12. 2).var module2 = {
  13. run: function() {
  14. console.log('hi module');
  15. }
  16. }

从这两种写法中我们可以看到,js中单独的模块并不一定是一个单独的类,而是将一组相关的逻辑写到一个模块中,目的在于程序架构清晰和便于协同开发。

2.类的概念
js中没有类,但是每个函数都可以使用new来生成新的对象。也就是说在js中每个函数都可以代表as中类的概念。那么类中私有方法,公开方法,私有属性和公开属性又是怎样实现的。可以看代码

  1. function ClassA(){
  2. var a 1//这里的a是在函数中使用var关键字声明的,表示的是ClassA中的私有属性,外部不可访问
  3. this.b = 2;//这里this调用的,表示的是ClassA中公开的属性。
  4. c = 3;//这里声明的c不在ClassA中,而是在全局作用域,相当于window.c = 3;
  5. function d(){//这种形式声明的函数属于私有函数,只能在ClassA中调用,window也无法调用。
  6. console.log('function d');
  7. }
  8.  
  9. this.e = function(){//这种形式声明的函数,属于公开函数
  10. console.log('function e');
  11. }
  12. }
  13. var cla = new ClassA();
  14. console.log(cla.a);//undefined
  15. console.log(cla.b);//2
  16. console.log(cla.c);//undefined
  17. console.log(window.c);//3
  18.  
  19. console.log(cla.d);//undefined
  20. console.log(cla.e);//输出函数e的实现
  21. console.log(window.d);//undefined

3.继承
aser都知道as继承一个类很简单只要使用extends就可以了。但是js里面继承是使用的原型继承,什么是原型继承呢。js里面对象有个prototype属性,我们利用这个属性来实现继承。代码演示如下:

  1. function ClassB(){
  2. this.a = 10;
  3. this.run = function(){
  4. console.log('函数run被调用');
  5. }
  6. }
  7.  
  8. function ClassC(){};
  9.  
  10. ClassC.prototype = new ClassB();//这样ClassC就继承了ClassB的属性和方法不信可以实验下
  11.  
  12. var t = new ClassC();
  13. console.log(t.a);//看到没,这里输出的是10
  14. t.run();//这里输出的是“函数run被调用”
  15.  
  16. ClassC.prototype.proA = 34;
  17.  
  18. console.log(t.proA);//34

4.命名空间
js里面的命名空间是如何实现的呢

  1. var com = {};
  2. com.amswf = {};
  3. com.amswf.utils = {};
  4. com.amswf.utils.PageUtil = function(){
  5. this.getPageURL = function(){
  6. return window.location.href;
  7. }
  8. }

上面概念如果理解的话,我们可以这样写一个类模块

  1. //PageUtil.js
  2. (function(window){
  3. window.com = {};
  4. com.amswf = {};
  5. com.amswf.utils = {};
  6. com.amswf.utils.PageUtil = function(){};
  7. com.amswf.utils.PageUtil.prototype.name = 'amswf';
  8. com.amswf.utils.PageUtil.prototype.getPageURL = function(){
  9. return window.location.href;
  10. };
  11. //其他属性方法可以继续。。。
  12. })(window)

外部使用如下:
var util = new com.amswf.utils.PageUtil();
console.log(util.getPageURL());//这里会输出当前网页地址
感兴趣的朋友,可以到我的博客上做客,http://amswf.com,会有更多东西奉献给大家。

js模块,类,继承,命名空间,私有属性等相关概念梳理的更多相关文章

  1. Java通过反射机制修改类中的私有属性的值

    首先创建一个类包含一个私有属性: class PrivateField{ private String username = "Jason"; } 通过反射机制修改username ...

  2. 类继承-super, 私有变量

    多继承 class A: def ces(self): print('a-ces') class B(A): def ces(self): print('b-ces') class C(A): def ...

  3. Python类总结-封装(私有属性,方法)

    封装基础 广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装 只让自己的对象能调用自己类中的方法 狭义上的封装-面向对象三大特性之一(私有变量,用公有的方法封装私有属性,方法叫封装) 把 ...

  4. 面向对象:继承(经典类&新式类继承原理、属性查找)、派生

    继承: 继承是指类与类之间的关系,是一种“什么”是“什么”的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基 ...

  5. js实现类选择器和name属性选择器

    jQuery的出现,大大的提升了我们操作dom的效率,使得我们的开发更上一层楼,如jQuery的选择器就是一个很强大的功能,它包含了类选择器.id选择器.属性选择器.元素选择器.层级选择器.内容筛选选 ...

  6. php闭包类外操作私有属性

    Closure::bind() Closure::bindTo(); class person{ private $age; private $sex; public function __const ...

  7. Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值

    大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属 ...

  8. Python的程序结构[0] -> 属性/Property[0] -> 类属性、实例属性和私有属性

    类属性.实例属性和私有属性 Python中类的属性主要包括类属性,实例属性和私有属性,下面是对三种属性的简单介绍 类属性 / Class Property 类属性在__init__()之外初始化,在外 ...

  9. Python中的私有属性私有方法、类属性类方法以及单例设计模式

    私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法.在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线) 公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只 ...

随机推荐

  1. Android开发系列之AChartEngine

    Android图表控件的开发 曾经开发过一个小程序,在Android电视机上面开发一个APP,用于显示一些统计图表的信息.最后找来找去基于Android Native开发有AChartEngine现成 ...

  2. 【转】C#.net拖拽实现获得文件路径

    C#.net拖拽实现获得文件路径 作者Attilax ,  EMAIL:1466519819@qq.com 思路: 通过DragEnter事件获得被拖入窗口的“信息”(可以是若干文件,一些文字等等), ...

  3. Maya QT interfaces in a class

    Most tutorials online have suggested the way to fire commands inside QT interfaces launched n Maya ( ...

  4. 使用Result代替ResultSet作为方法返回值

    在开发过程中,我们不能将ResultSet对象作为方法的返回值,因为Connection连接一旦关闭,在此连接上的会话和在会话上的结果集也将会自动关闭,而Result对象则不会发生这种现象,所以在查询 ...

  5. poj 2104 K-th Number 划分树,主席树讲解

    K-th Number Input The first line of the input file contains n --- the size of the array, and m --- t ...

  6. Linux CentOS下shell显示-bash-4.1$ 不显示用户名和主机名的解决方法

    CentOS下新增加一个用户,登录进去会发现shell脚本信息没有显示用户名和主机名,反而显示的是-bash-4.1$,如图所示: 而不是我们经常看到的username@hostname$的组合,看起 ...

  7. 【Http】Http权威指南

    God Is Coder 2012-10-17 22:25 阅读:77 评论:0   <http权威指南>阅读笔记(十二) God Is Coder 2012-10-17 22:04 阅读 ...

  8. C#并行和多线程编程_(1)认识Parallel

    Parallel: 英 [ˈpærəlel]    美 [ˈpærəˌlɛl] ,并联的,并行的. 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性 ...

  9. 加解密算法二:非对称加解密及RSA算法的实现

    加密和解密使用不同的密钥的一类加密算法.这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密):相反,使用密钥B加密数据得到的密文,只有密钥 ...

  10. C++函数转换成C#函数

            ///                        /// </param>         /// <returns></returns>    ...