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. OpenJudge 2803 碎纸机 / Poj 1416 Shredding Company

    1.链接地址: http://poj.org/problem?id=1416 http://bailian.openjudge.cn/practice/2803 2.题目: 总时间限制: 1000ms ...

  2. libipq —— iptables用户空间数据包排队库

    LIBIPQ(3) NAMElibipq —— iptables用户空间数据包排队库 SYNOPSIS #include <linux/netfilter.h>#include <l ...

  3. Java Web开发之Servlet、JSP基础

    有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发 ...

  4. jquery-easyui使用

    1,闲来无事用了一下jquery-easyui,首先下载下来easyui,文件夹如图 2,将themes里面的东西整体拷贝,我是整体的,省的麻烦了 3,在在自己的vs里面新建一个mvc的项目(项目自己 ...

  5. ecshop二次开发 给商品添加自定义字段

    说起自定义字段,我想很多的朋友像我一样会想起一些开源的CMS(比如Dedecms.Phpcms.帝国)等,他们是可以在后台直接添加自定义字段的. 抱着这种想法我在Ecshop的后台一顿找,不过肿么都木 ...

  6. 【DB】SQLiteHelper

    /// <summary> /// 说明:这是一个针对System.Data.SQLite的数据库常规操作封装的通用类. /// </summary> public class ...

  7. Silverlight之我见

    好长时间没搞Silverlight方面的开发了,原本都以为自己早已忘记,然而前阵子(确切一点说,是挺长时间以前了)的时候,发布Windows10的时候,微软宣布新的浏览器将重新开发,关键是后半句引起了 ...

  8. 【applicationContext.xml】配置文件找不到

    配置文件找不到时可以手动配置一下此处 信息: Initializing Spring root WebApplicationContext 八月 12, 2015 5:36:45 下午 org.apa ...

  9. git 提交

    git rebase -i 在使用git开发的时候经常会面临一个常见的问题.多个commit 需要合并为一个完整的commit提交. 合并多个commit为一个完整的commit 我先基于develo ...

  10. JDBC之PreparedStatement模糊查询

    今天要做一个关于模糊查询的需求,以前用JDBC做精确查询都是用 "SELECT * FROM test WHERE id = ?",所以用模糊查询时理所当然的也用了"SE ...