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

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

//module1.js
1).(function(namespace) {
function log() {
console.log('test');
}
namespace.run = function() {
log();
};
})(window.module1 = window.module1 || {}); //module2.js
2).var module2 = {
run: function() {
console.log('hi module');
}
}

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

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

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

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

function ClassB(){
this.a = 10;
this.run = function(){
console.log('函数run被调用');
}
} function ClassC(){}; ClassC.prototype = new ClassB();//这样ClassC就继承了ClassB的属性和方法不信可以实验下 var t = new ClassC();
console.log(t.a);//看到没,这里输出的是10
t.run();//这里输出的是“函数run被调用” ClassC.prototype.proA = 34; console.log(t.proA);//34

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

var com = {};
com.amswf = {};
com.amswf.utils = {};
com.amswf.utils.PageUtil = function(){
this.getPageURL = function(){
return window.location.href;
}
}

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

//PageUtil.js
(function(window){
window.com = {};
com.amswf = {};
com.amswf.utils = {};
com.amswf.utils.PageUtil = function(){};
com.amswf.utils.PageUtil.prototype.name = 'amswf';
com.amswf.utils.PageUtil.prototype.getPageURL = function(){
return window.location.href;
};
//其他属性方法可以继续。。。
})(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. 九度OJ 朋友圈 -- 并查集

    题目地址:http://ac.jobdu.com/problem.php?pid=1526 题目描述: 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友.. ...

  2. 九度OJ 1532 棋盘寻宝扩展 -- 动态规划【背包问题】

    题目地址:http://ac.jobdu.com/problem.php?pid=1532 题目描述: 现在有一个8*8的棋盘,上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大 ...

  3. HTML5之地理信息应用 获取自己的位置

    上代码: window.onload = function() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosit ...

  4. jQuery事件绑定和委托

    可以用多种方法实现,on()  . bind()  . live()  . delegate() ,还有one(). 有时我们可能会像下面这样绑定一个事件: $("#div1"). ...

  5. Oracle 分析函数之聚集函数(MAX、MIN、AVG和SUM)

    MAX 查找组中表达式的最大值 MAX(COL ) OVER ( [ <partition_by_clause> ] < order_by_clause > )MIN 查找组中 ...

  6. Oracle 排序分析函数之ROW_NUMBER、RANK和DENSE_RANK

    我们都知道分析函数功能很强大,可能需要写很复杂的标准SQL才能办到或不可能办到的事,使用分析函数却能很容易完成.我们经常会用到排序分析函数,如ROW_NUMBER,RANK,DENSE_RANK.这三 ...

  7. Servlet的getContextPath(), getServletPath(), getRequestURI(), getRealPath("/")

    假定web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 则执行下面向行代码后打印出如下结果: ...

  8. Hadoop Datanode节点无法启动(All directories in dfs.data.dir are invalid)

    Hadoop Datanode节点无法启动(All directories in dfs.data.dir are invalid) java.io.IOException: All director ...

  9. WordPress 前端用户投稿插件 Frontend Publishing

    WordPress添加投稿功能(无需注册/可邮件通知站长和投稿人) WordPress匿名投稿插件:DX-Contribute (有朋友反馈不能用) WordPress投稿插件:User Submit ...

  10. chr(i) 返回整数i对应的ASCII字符

    >>> a 122 >>> b 344 >>> c = chr(a) >>> c 'z' 假如整数“i”超过了256将会爆出一个 ...