就自己而言AS3的命名空间用的确实不多,今天偶然翻翻书看到,于是便觉得这个东西其实还是挺不错的。对于封装的概念阐释的比较具体。

如果在一个项目中,交由A 写一些处理文本方面的工具方法,交由B写一些处理显示对象的工具方法。一般情况下这些方法存在于同一个工具类里面,或者是存在于不同的里面。如果我只想使用A的工具 ,那么只需要使用A的命名空间即可,就将A写的工具给筛选出来。

 

首先看了下官方API

namespace 定义关键字

用法
namespace  name [=uri]
允许您控制定义的可见性。预定义的命名空间包括 publicprivateprotectedinternal。下列步骤说明如何创建、应用和引用命名空间:

  • 首先,使用 namespace  关键字来定义自定义命名空间。例如,代码 namespace version1 将创建名为 version1 的命名空间。
  • 其次,在属性或方法的声明中使用自定义命名空间将此命名空间应用于属性或方法。例如,代码 version1 myProperty:String 将创建名为 myProperty 的属性,该属性属于 version1 命名空间
  • 最后,通过使用 use 关键字或使用命名空间作为标识符的前缀来引用该命名空间。例如,代码 use namespace version1; 引用后续代码行的 version1 命名空间,而代码 version1::myProperty 引用 myProperty 属性的 version1 命名空间。

参数

name:Namespace — 命名空间的名称,可以是任意合法的标识符。
uri:String — 命名空间的统一资源标识符 (URI)。这是一个可选参数。

大概意思是说 平时咱们使用的private public 这些访问限制符 是官方提供的,而使用namespace关键字可以自定义自己的访问限制符。

 namespace myNameSpace

而使用的时候 和 其他访问限制符类似 如定义一个变量

 myNameSpace var name:String = '朽木可雕';

而在其他地方使用的时候 可以使用use namespace myNameSpace 来使用这个命名空间中的所有对象。也可以使用 myNameSpace::name 来访问刚才定义的name 属性。那么这两个有什么区别?

使用use 的话 相当于是将采用 myNameSpace 修饰的所有对象都给公开了,而没法关闭。

使用 :: 的话 就相当于 需要的时候使用 用完之后就关闭。

下面用具体的代码实现 来阐述:

首先创建一个myFirstNameSpace.as文件,并修改内部的初始化代码。如下:

myFirstNameSpace.as:


package com._523326.nameSpaces
{
public namespace myFirstNameSpace ;
}

创建一个使用命名空间进行修饰变量的类 NSItem.as:


package com._523326
{
import com._523326.nameSpaces.myFirstNameSpace;

public class NSItem
{
myFirstNameSpace var webName:String = "朽木可雕";
public function NSItem()
{
}
}
}

然后在主类里面使用

用use 实现:


<code></code>package
{
import com._523326.NSItem;
import com._523326.nameSpaces.myFirstNameSpace;

import flash.display.Sprite;

use namespace myFirstNameSpace;
public class NameSpaceTest extends Sprite
{
private var mItem:NSItem;
public function NameSpaceTest()
{
mItem = new NSItem( );
trace( mItem.webName );//输出:朽木可雕
}
}
}

用 :: 方式实现


package
{
import com._523326.NSItem;
import com._523326.nameSpaces.myFirstNameSpace;

import flash.display.Sprite;

public class NameSpaceTest extends Sprite
{
private var mItem:NSItem;
public function NameSpaceTest()
{
mItem = new NSItem( );
trace( mItem.myFirstNameSpace::webName );//输出:朽木可雕
}
}
}

就是说 用use的话 只要在一开始使用了use namespace 那么后面某个对象对其内部属性或方法的调用 就如同public一样

而用::这种方式的话,每次调用的时候 都必须引用一次命名空间。

 

接下来再创建一个命名空间


package com._523326.nameSpaces
{
public namespace mySecNameSpace ;
}

加入到NSItem里面


package com._523326
{
import com._523326.nameSpaces.myFirstNameSpace;
import com._523326.nameSpaces.mySecNameSpace;

public class NSItem
{
mySecNameSpace var webName:String = "朽木可雕 mySecNameSpace";
myFirstNameSpace var webName:String = "朽木可雕 myFirstNameSpace";
public function NSItem()
{
}
}
}

可以看到上面的变量名称是一样的 因为属于不同的命名空间 所以变量名允许相同。(为了测试所以将变量名弄为相同)

同样在主类里面使用的话,可以发现如果将两个命名空间都使用use来打开的话,对webName变量的引用就出现报错。

而使用::的话 就是正常的显示。

 

在上面的API中可以看到还有一个URI,而其是可选的。这个就相当于给命名空间指定一个名字。如果URI相同的话 将会认为是同一个命名空间

如public namespace myFirstNameSpace = “myFirstNameSpace”;

public namespace mySecNameSpace = “myFirstNameSpace”;

那么上面的NSItem将会出现报错,因为同一个命名空间里面存在着两个相同名称的变量。

就是说如果不指定URI的值的话 命名空间的唯一性将根据其 name 来判定,如果指定了URI的值 那么将根据URI的值来判定。

 

更新 2015/03/03

namespace在XML中的使用

由于在接触XML 以来 一直到前几天个人书写XML大体如下

<?xml version=”1.0″ encoding=”utf-8″ standalone=”no”?>

<Sample>

<item>xxx</item>

</Sampel>

所以也没怎么注意xml中的命名空间问题,前两天在修改读取xlsx格式文件的时候,留意到加载进来的xlsx格式中的xml书写中包含了这样的格式

<Sample xmlns = “www.sample.com” xmlns:xx = “www.sample.com/sample”>

<item>xxx</item>

<xx:info label = “xxxx”/>

</Sample>

一开始并未留意这个,而是按照通常的解析方法来解析,

trace( xml.item)

输出发现只是一个空字符串,百度了下xmlns才知道xml也有他的命名空间,接着查找ASAPI文档。于是就有了答案


var ns:NameSpace = new NameSpace("www.sample.com");

default xml namespace = ns;

trace( xml.item)

这样便可正常获取想要的xml数据了

而我们也注意到 上面还有一个  xmlns:xx = “www.sample.com/sample”,那么这个是啥呢 注意到xml中的最后一行数据书写是

<xx:info label = “xxxx”/>

如果我们尝试获取info的label属性 发现会是空字符串


var ns:NameSpace = new NameSpace("www.sample.com");

default xml namespace = ns;

trace( xml.info.@label );

注意到 后面那句的前面 同样有一个 xmlns 即这个也是xml的命名空间 而其名字 为xx 和下面的<xx:info label = “xxxx”/>中的xx对应

于是修改代码


var ns:NameSpace = new NameSpace("www.sample.com/sample");

default xml namespace = ns;

trace( xml.info.@label );

正常输出//xxxx;

所以xml的命名空间为 通过xmlns定义的是 而冒号后面的为此命名空间的名字,至于像第一个的命名空间 ,其实可以理解为名字为空

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Free Web Hosting