如何实现javascript js 类命名空间的写法

JavaScript08

如何实现javascript js 类命名空间的写法,第1张

在C#中有namespace概念,java中有package的概念,有了这些概念之后,在系统的运行时,每一个方法就会拥有唯一的访问路径

namsepace.class.object,这样就可以避免由于object重名所导致的问题.

由于javascript是一种解释型语言,在javascript中,如果定义两个同名函数或者变量,系统会用最后一个函数或变量来替换前一个函数和变量,

如果是一个的单人开发的系统,则不会产生很多异常,因为可以人为的控制这些命名的唯一,如果是大型多人协同开发系统,则可能产生很多异常,增加程序的调试难度。

举例说明命名空间必要性

例如我们编写一个页面 引入jquery框架,然后我们在页面里面自定义一个$函数,那么$ 函数可能会失效,或者产生莫名其妙的现象

命名空间使用

<input type="button" value="命名空间使用" onclick="(new namespace()).$()"/>

<script type="text/javascript">

function namespace(){

this.$=function(){

alert(‘命名空间使用!’)

}

}

</script>

这种写法,其实就是在namespace下定义了一个$

简化每次都 new namespace

<input type="button" value="命名空间使用" onclick="t.$()"/>

<script type="text/javascript">

(function namespace(){

this.$=function(){

alert(‘命名空间使用!’)

}

window.t ={}

window.t=this

})()

</script>

进阶篇

在一个命名空间里面可以像 C# java一样包含很多变量和方法

<input type="button" value="命名空间使用" onclick="t.$()"/>

<input type="button" value="命名空间简化调用" onclick="method3()"/>

<input type="button" value="命名空间method2使用" onclick="t.method2()"/>

<input type="button" value="命名空间method3使用" onclick="t.method3()"/>

<input type="button" value="命名空间a变量赋值使用" onclick="t.a=999"/>

<script type="text/javascript">

(function namespace(){

this.$=function(){

alert(‘命名空间使用!’)

}

this.method2=function(){

alert(“this method 2!”)

}

this.a=”888″

this.method3=function(){

alert(“命名空间内部变量:a”+a)

}

window.t ={}

window.t=this

window.t.method3=method3

})()

</script>

怎么会不符合逻辑呢?首先由ns += arr[i]得到ns的值,这里我假设得到的值是b那么eval("if(typeof(" + ns + ") == 'undefined')" + ns + " = new Object()")实际就是eval("if(typeof(a) == 'undefined')a= new Object()")经过eval编译执行后实际就是if(typeof(a) == 'undefined'){a= new Object()}

命名空间和模块不要混用,不要在一个模块中使用命名空间,命名空间最好在一个全局的环境中使用

namespace中可以定义任意多的变量,这些变量只能在shape下可见,如果要在全局内可见的话就要使用export关键字,将其导出.

本质上是闭包,用来隔离作用域。

ts保留了这种方式,但是在我们平时的模块化开发中,也没必要使用命名空间。

如果在一个js中的namespace过于庞大,可以写多个js文件,他们共享同一个命名空间

互相引用的时候 /// <reference path = "a.ts" >

访问:

Shape.cricle()

起别名:import cricle = Shape.cricle()