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

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,会有更多东西奉献给大家。

时间: 2024-11-08 22:28:08

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

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

实现步骤: 1.首先创建一个类包含一个私有属性 public class PrivateTest { private String name = "hello"; public String getName() { return name; } } 2.通过反射机制修改name的值 import java.lang.reflect.Field; public class ReflectionTest { public static void main(String[] args) th

反射学习3-通过反射机制修改类中的私有属性的值

 一.准备知识:    Java反射机制以及域的获取与设置的相关方法  二.实现步骤: 1.首先创建一个类包含一个私有属性: class PrivateField{     private String username = "Jason"; } 2.通过反射机制修改username的值: //创建一个类的对象 PrivateField privateField = new PrivateField(); //获取对象的Class Class<?> classType =

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

首先创建一个类包含一个私有属性: class PrivateField{ private String username = "Jason"; } 通过反射机制修改username的值: //创建一个类的对象 PrivateField privateField = new PrivateField(); //获取对象的Class Class<?> classType = privateField.getClass(); //获取指定名字的私有域 Field field =

Python3基础 类的伪私有属性 __加变量名 的示例

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ex1: code: class MyClass : #属性,公有的 height=10 weight=20 #伪私有属性 __haha=30; test=MyClass() print(test.__haha) result: ============= RESTART: C:\Users

JS中“类”继承和原型继承

类继承: 先用函数构造器创建了一个“类”Student,然后在Student原型上定义了一个方法sayHello,然后创建了一个"类“PrimaryStudent,用apply()初始化PrimaryStudent. 然后让PrimaryStudent的原型等于Student创建的对象,并把PrimaryStudent原型上的构造器指向当前”类“,即PrimaryStudent,注意红色加粗部分. 1 function Student(name){ 2 this.name = name; 3 }

JS模拟类继承

//最后一个参数是JSON表示的类定义 //如果参数大于一,则第一个参数是基类,否则,基类是object //中间的参数是类实现的接口 //返回值是类,类是一个构造函数,并继承了基类的prototype function Class(){ aDefine = arguments[arguments.length - 1]; //传入的最后一个参数是要定义的类 if(!aDefine) return; //如果没用传参数,则直接结束. var aBase = arguments.length>1?

软件开发的目录规范/定制程序的入口/引用配置文件/引用自定义模块/logging模块/日志继承与propagate属性/通过字典导入配置/日志模块在项目中的使用

02.软件开发的目录规范单独的文件放单独的东西py文件src 程序的核心有关setting 配置有关common 常用功能的集合体 文件夹lib 库log 日志conf 配置文件有关的db 数据有关的文件夹bin 整个程序的入口放启动文件core 里面写主逻辑=====================read me 解释说明文件夹里面做什么 原文地址:https://www.cnblogs.com/wangmiaolu/p/8734561.html

子类继承父类的私有属性

最近学习继承,从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法

js对象的继承

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script> //继承 : 子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 ) //属性的继承 : 调用父类的构造函数 call //