今天跟dio友们讨论起属性表的实现,很多人刚开始是接触不到属性表的,有点懵,我就顺便总结了一下,以我的理解,可行的用法如下:

1、类内直接定义:

import console;
class me {aa=123;// 这里以@开头,按照..util.metaProperty()约定规则,直接创建属性表:@..util.metaProperty(sxid = {_get =function(){return "aa:" ++  owner.aa; };_set = function(v){owner.aa = v*2};});
}
var t =me();
console.dump(t.sxid);
t.sxid=123;
console.log(t.sxid);
console.pause(true);

运行结果:

2、通过类内定义的私有变量创建属性表:

import console;
class me {ctor(){// 这里定义一个私有变量(名称可以随意),用于保存属性表内容:var metaProperty = ..util.metaProperty(sxid = {_get =function(){return "aa:" ++  this.aa; }_set = function(v){this.aa = v*2}})}aa=123;// 这里通过引用私有变量创建属性表:@metaProperty;
}
var t =me()
console.dump(t.sxid)
t.sxid=123
console.log(t.sxid)
console.pause(true);

运行结果:

3、通过类内定义的公开变量创建属性表:

import console;
class me {// 这里定义一个公开变量(名称可以随意),用于保存属性表内容:metaProperty = ..util.metaProperty(sxid = {_get =function(){return "aa:" ++  this.aa; };_set = function(v){this.aa = v*2};});aa=123;// 这里通过引用公开变量创建属性表:@this.metaProperty;
}
var t =me()
console.dump(t.sxid)
t.sxid=123
console.log(t.sxid)
console.pause(true);

运行结果:

注意:属性表一旦被定义,是不可修改的。

这里的公开变量 metaProperty ,一旦被引用创建属性表后,即使变量值被修改了,也不影响已经定义的属性表。

如:

import console;
class me {metaProperty = ..util.metaProperty(sxid = {_get =function(){return "aa:" ++  owner.aa; };_set = function(v){owner.aa = v*2};});aa=123;@this.metaProperty;
}   me.metaProperty = 456 // 这里修改类的属性表变量值
var t =me()t.metaProperty = 789 // 这里修改实例的属性表变量值console.dump(t.sxid) //这里输出123。
t.sxid=123 // 这里检测属性表是否被修改。
console.log(t.sxid)  //这里仍然输出246,证明原属性表仍在。
console.pause(true);

运行结果:

4、类外定义:

这种方法会让类看起来更整洁,属性表的定义与类的声明是分离的,维护起来也更容易。aardio官方基本都用这种方法。如果属性较多,推荐这种方法。如果属性较少,可以使用方法1直接定义。

import console;
class me {aa=123;// 这里创建属性表,内容为类外赋值。@metaProperty;
}
// 类外给属性表内容赋值:
me.metaProperty = ..util.metaProperty(sxid = {_get =function(){return "aa:" ++  owner.aa; };_set = function(v){owner.aa = v*2;};};
)
var t =me()
console.dump(t.sxid)
t.sxid=123
console.log(t.sxid)
console.pause(true);

运行结果:

官方手册上将:me.metaProperty = ..util.metaProperty()

定义为:var me.metaProperty = ..util.metaProperty()

据我测试,会报警提示,不成功。

5、注意事项:

1、属性表是不可见的,console.dump(类实例) 的时候,是看不见属性表的存在的。

2、当省略 _get 时可以创建一个只写属性,而省略 _set 时可以创建一个只读属性。

3、使用下划线 _ 作为首字符的类成员是只读成员,即使定义了_set,在_set内修改其值也会出错,如:

import console;
class me {_aa=123; // 定义一个只读变量@..util.metaProperty(sxid = {_get =function(){return "aa:" ++  owner._aa; };_set = function(v){owner._aa = v*2 // 试图修改只读变量的值};});
}
var t =me();
console.dump(t.sxid);
t.sxid=123;
console.log(t.sxid);
console.pause(true);

运行结果如下,明确的提示“不能修改一个只读变量 '_aa' ”。

首先:错误行号 17 行:t.sxid=123;  试图给实例变量 sxid 赋值;导致下一步错误:

导致:错误行号 10 行:owner._aa = v*2 ;试图给只读变量 _aa 赋值;

aardio - 属性表相关推荐

  1. 将FeatClass属性表高效率转换成DataTable

    把IFeatureClass\ ITable转换成DataTable,效率高. 方法一 ITable遍历行 1.用IFeatureClass属性查询的方式较慢,这样速度可提高几十倍. 2.避免了hre ...

  2. VS创建props属性表并在新项目中导入props属性表

    创建props属性表过程见配置PCL的一个例子:VS2019配置PCL 上面一篇执行完现在生成了pclX64.props 创建一个新的项目: 创建好了之后,复制进来两个文件,那个pcd模板文件见上面那 ...

  3. 去除ArcMap连接空间数据库中多余的属性表

    这个操作目前可能不具有可行性,但是为了完整性还是在下面讲一下吧.如有兴趣的小伙伴,可以按照下面的操作方式去尝试. 一.需求 去除ArcMap连接空间数据库中多余的属性表. PL/SQL中查询得到的内容 ...

  4. vs如何将工程配置,保存到属性表

    本机有个: opencv412_release_x64_vs2017.props 现在介绍一种将工程配置,保存到属性表的方法,那么下次新建工程时,只要添加这个属性表,整个配置就完成了-- 首先新建一个 ...

  5. gis属性表怎么导成excel_使用Python脚本将Excel表批量赋值到ArcGIS属性表

    现需要将Excel表信息批量赋值(不是挂接)到Shp文件的属性表,两张表的字段.记录数一模一样,至于为什么会出现这样的问题,咱也不敢问,只有想个法子把它搞定! 原始的Excel信息表共57列,总共3万 ...

  6. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )

    文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...

  7. gis属性表怎么导成excel_第022篇:ArcGIS中将属性表直接导出为Excel的方法

    在使用ArcGIS处理数据的过程中,经常需要导出属性表.无论是分析也好,是添加复杂字段内容也好,Excel都要比ArcGIS本身出色得多.大家通常采用的方式是先导出成txt或dbf,再转成Excel. ...

  8. VS2010属性表的建立与灵活运用

    问题引入:在VS2010当中,进行opencv.QT等的编程时,总是需要配置很多属性还有依赖项等,为了减少每次都重复配置属性的工作量,现在可以运行属性表这个东西来简化配置.opencv也可以这样建立使 ...

  9. 超图数据集管理基本操作和添加删除属性表字段

    打开一个自带数据源:这是一个数据源模板:里面数据是空的: 右击数据集,属性: 工作空间管理器选中矢量数据集,数据集属性面板中会显示:数据集.投影.矢量.属性表.值域五个面板: 数据集信息     面板 ...

最新文章

  1. OpenCV的示例程序在哪里?
  2. WPF里ItemsControl的分组实现
  3. 机器学习算法与Python实践之(一)k近邻(KNN)
  4. 深度学习算法_爱奇艺深度学习算法实习生面经
  5. 张朝阳直播带货首秀 带的不仅是好物而是价值平台
  6. Maven 仓库优先级
  7. 3-3 银行业务队列简单模拟 (25 分)
  8. SLAM学习笔记-------------(12)建图
  9. sqlite3数据库-常用命令
  10. 【esp8266】【Node.js】【Websocket】esp8266和Node.js通过websocket进行通信,实验记录及踩坑记录
  11. 电脑语言栏消失看我怎么办
  12. win10下安装php7.2的memcache扩展
  13. JavaScript几种原生函数
  14. 网站安全与渗透测试工程师岗位区别
  15. Aspose.Imaging for .NET V23
  16. p:nth-child(1) : 选择p是子元素中的第一个元素
  17. 小猫爪:PMSM之FOC控制05-让电机开环转起来
  18. DIN数据处理与理解
  19. Impinj GPIO快速上手指南
  20. [四旋翼无人机PID仿真(一)

热门文章

  1. 计算机一级2019题百度云,2019全国计算机等级考试一级真题操作题.pdf
  2. 一款非常好用的终端模拟器/免费ssh客户端
  3. Oracle 交、差、并
  4. python编程100例海绵宝宝-python基础1(理论基础)
  5. 计算机网络知识串讲复习(超全)
  6. 如何从IT外包中获得最大的商业价值?
  7. 你找到适合自己的赚钱门路了吗
  8. 16位先行进位加法器--原理篇
  9. x86汇编语言复习总结
  10. 禁止开机时软件自启动的三种方法