aardio - 属性表
今天跟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 - 属性表相关推荐
- 将FeatClass属性表高效率转换成DataTable
把IFeatureClass\ ITable转换成DataTable,效率高. 方法一 ITable遍历行 1.用IFeatureClass属性查询的方式较慢,这样速度可提高几十倍. 2.避免了hre ...
- VS创建props属性表并在新项目中导入props属性表
创建props属性表过程见配置PCL的一个例子:VS2019配置PCL 上面一篇执行完现在生成了pclX64.props 创建一个新的项目: 创建好了之后,复制进来两个文件,那个pcd模板文件见上面那 ...
- 去除ArcMap连接空间数据库中多余的属性表
这个操作目前可能不具有可行性,但是为了完整性还是在下面讲一下吧.如有兴趣的小伙伴,可以按照下面的操作方式去尝试. 一.需求 去除ArcMap连接空间数据库中多余的属性表. PL/SQL中查询得到的内容 ...
- vs如何将工程配置,保存到属性表
本机有个: opencv412_release_x64_vs2017.props 现在介绍一种将工程配置,保存到属性表的方法,那么下次新建工程时,只要添加这个属性表,整个配置就完成了-- 首先新建一个 ...
- gis属性表怎么导成excel_使用Python脚本将Excel表批量赋值到ArcGIS属性表
现需要将Excel表信息批量赋值(不是挂接)到Shp文件的属性表,两张表的字段.记录数一模一样,至于为什么会出现这样的问题,咱也不敢问,只有想个法子把它搞定! 原始的Excel信息表共57列,总共3万 ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )
文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...
- gis属性表怎么导成excel_第022篇:ArcGIS中将属性表直接导出为Excel的方法
在使用ArcGIS处理数据的过程中,经常需要导出属性表.无论是分析也好,是添加复杂字段内容也好,Excel都要比ArcGIS本身出色得多.大家通常采用的方式是先导出成txt或dbf,再转成Excel. ...
- VS2010属性表的建立与灵活运用
问题引入:在VS2010当中,进行opencv.QT等的编程时,总是需要配置很多属性还有依赖项等,为了减少每次都重复配置属性的工作量,现在可以运行属性表这个东西来简化配置.opencv也可以这样建立使 ...
- 超图数据集管理基本操作和添加删除属性表字段
打开一个自带数据源:这是一个数据源模板:里面数据是空的: 右击数据集,属性: 工作空间管理器选中矢量数据集,数据集属性面板中会显示:数据集.投影.矢量.属性表.值域五个面板: 数据集信息 面板 ...
最新文章
- OpenCV的示例程序在哪里?
- WPF里ItemsControl的分组实现
- 机器学习算法与Python实践之(一)k近邻(KNN)
- 深度学习算法_爱奇艺深度学习算法实习生面经
- 张朝阳直播带货首秀 带的不仅是好物而是价值平台
- Maven 仓库优先级
- 3-3 银行业务队列简单模拟 (25 分)
- SLAM学习笔记-------------(12)建图
- sqlite3数据库-常用命令
- 【esp8266】【Node.js】【Websocket】esp8266和Node.js通过websocket进行通信,实验记录及踩坑记录
- 电脑语言栏消失看我怎么办
- win10下安装php7.2的memcache扩展
- JavaScript几种原生函数
- 网站安全与渗透测试工程师岗位区别
- Aspose.Imaging for .NET V23
- p:nth-child(1) : 选择p是子元素中的第一个元素
- 小猫爪:PMSM之FOC控制05-让电机开环转起来
- DIN数据处理与理解
- Impinj GPIO快速上手指南
- [四旋翼无人机PID仿真(一)