ECMAScript 初探 - 对象篇
一、对象
如果你用过 C++ 或 Java,肯定熟悉类(class)。在 ECMAScript 中并没有 “类” 这个词, 其对应的是 “对象定义”,不过这太拗口了,因此还是诜择使用 “类” 这个词。
对象是由 new 运算符加上要实例化的类型的名字创建的。比如下面的代码创建 Array 类的实例:
var a = new Array();
在语法上与 C++ 类似。如果类的构造函数没有参数,括号可以省略;如果有多个参数, 则必须使用括号。为了避免混乱,笔者建议都使用括号。
1.1 Objec
Object 类是所有 ECMAScript 类的基类,Object 类的所有属性和方法都会出现在其他类中,理解了 Object 类,就可以更好地理解其他类。
Object 类具有下列属性:
- constructor,指向创建对象的函数,对于 Object 类,它指向 object() 函数。
- prototype,对该对象的对象原型的引用。暂时可以将原型理解为 C++ 中的类声明,不过不同的是,ECMAScript 允许在运行时改变对象原型,而 C++ 中的类一旦声明后, 其成员变量和方法都不可在运行时增删。
Object 类还有几个方法:
- hasOwnProperty(property),判断对象是否有某个属性,property 为字符串,比如 root.hasOwnProperty ("width”)。
- isPrototypeOf(object),判断该对象是否为另一个对象的原型。
- propertylsEnumerable(property),判断给定的属性是否可以用 for...in 语句进行枚举。
- toString(),返回对象的字符串表示。在 QML 中,很多 Qt 提供的类型,如 Rectangle, toString() 方法返回其对应的 C++ 类型名字或 QML 类型名字。
- valueOf(),返回最适合该对象的原始值。对于许多类,该方法返回的值都与 toString() 一样。
上面列出的每种属性和方法都可能会被 Object 的派生类覆盖。
下面是使用上述方法的一个简单的 QML 文档:
import QtQuick 2.2
Rectangle {
id: root;
Component.onCompleted:{
var obj = new Object();
console.log(obj.toString());
console.log(obj.constructor);
console.log(root.hasOwnProperty("width"));
console.log(Item.isPrototypeOf(root));
console.log(root.propertylsEnumerable("childrenM));
console.log(root.toString());
console.log(root.valueOf());
}
你可以使用 qmlscene 加载上面的QML文档来查看运行结果。
动态增加属性
在 ECMAScript 中,对象的属性可以动态地增删,非常有趣,与 C++ 这种强类型语言有 很大不同。比如下面的代码:
var person = new Object();
person.name = "zhangsan";
person.year = 20;
我们构造了一个对象 person,然后使用操作符设置其 name 属性为 zhangsan,year
属性为 20,而这两个属性原本是没有的,是在对象已经创建之后添加的。
动态增加方法
对象的方法就是一个函数,也可以动态地增加,然后按函数的方式调用。
person.printInfo = function printlnfo(){
console.log("name -", this.name, "year -", this.year);
}
person.printlnfo();
使用数组下标访问属性和方法
没有做不到的,只有想不到的,对象的属性和方法居然可以使用数组下标来访问。比如这样:
console.log(person["name"]); // -> person.name
person ["printlnfo"](); // -> person.printlnfo()
如你所见,使用数组下标访问时,索引是代表属性和方法名字的字符串,而不是我们常见的整数。
我们可以把对象理解为 Key-Value 对的集合,属性、方法名就是 Key,其指向的,就是 Value。
对象的字面量表示法
前面介绍原始类型时提到了数字字面量、字符串字面量,其实对象也能用字面量表示。 例如:
var person = {
"name": "zhangsan",
"year": 20
}
对象的字面量表示法,语法是这样的:使用一对花括号表示一个对象,其属性以 Key:Value 对的形式放在花括号内,多个属性之间使用逗号分隔;如果一个属性本身是对象,还可以使 用字面量表示法来嵌套描述。
1.2 String
String 类是 String 原始类型的对象表示法。其实 Boolean、Number 也有对应的对象表示 法,不过我们一般都直接使用原始值,略过不提。
你可以这样构造一个 String 对象:
var str = new String("I\'m a string");
String 对象的 valueOf() 方法和 toString() 方法都会返回 String 类型的原始值。
String 类型比较复杂,本节重点介绍其基本功能。
(1)字符串长度
length 属性返回字符串中的字符个数:
var str = new String("I\'m a string");
console.log(str.length);
上面示例输出的是 12。对于 String 类型的原始值,同样可以通过 length 属性获知字符串长度。比如:console.log("I\'m a string".length);
。
(2)访问单个字符
charAt() 方法可以访问指定索引位置的字符。前面己经介绍过,可以使用数组下标的形式访问字符串中的字符。而 charCodeAt() 方法返回指定位置字符对应的 Unicode 编码。 下面是简单的示例:
var str = new String("I\'m a string");
console.log (str. char At (2)); // 输出:m
console • log (str [0]); // 输出:I
console.log (str.charCodeAt (1)); // 输出:39
(3)査找子串
indexOf() 方法从字符串的幵头检索子串,lastlndexOf() 方法从字符串的结尾开始检索子串,它们返回给定的子串在本对象代表的字符串中的位置,如果找不到则返回 -1。这两个方法还有一个可选的参数,指定开始查找的位置。
search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。它是区分大小写的。它总是从字符串的开始进行查找。
match() 方法可在字符串内检索指定的值,或者寻找匹配指定正则表达式的一个或多个子串。如果检索到了符合规则的子串,它会返回一个存放所有子串的数组。
需要注意的是,上面 4 个用于查找的方法,都是区分大小写的。以一个忽略大小写的正则表达式为参数调用 search() 或 match() 方法,可以实现忽略大小写的查找。
下面是简单的示例:
var str = new String("I\'m a string");
console.log(str.indexOf("ing")); // 输出:9
console.log(str.search("i")); //输出:9,而非 0
console. log (str.match("tri")); // 输出:[tri]
var numberSource = new String ("2014-08-18, I got 96");
var results = numberSource.match(/\d+/g);
console.log (results.length); // 输出:4
console. log (results); // 输出:[2014,08, 18,96]
(4)字符串比较
localeCompare() 方法在比较字符串时,默认釆用底层操作系统提供的排序规则。当本对象等于参数字符串时此方法返回0,小于时返回小于 0 的值(QML中为-1),大于时返回大于0的值(QML中返回1)。
示例代码片段:
var strl = "Qt Quick";
var str2 = "qt quick";
var str3 = "ok";
console.log (strl == str2); // 输出:false
console.log (strl < str2); // 输出:true
console.log (strl.localeCompare(str2)); // 输出:1
console.log (str3.localeCompare (str2)); // 输出:-1
(5)连接字符串
concat() 方法用于连接两个或多个字符串,返回一个新的字符串原始值。使用 “ + ” 运算符可以更方便地连接字符串,效果和 concat() —样。示例代码片段:
var strl = new String("Qt");
var str2 = "Quick";
var strResult = strl.concat(str2, " is", " great!");
console.log(strResult);
console.log(strl);
console.log(strl.concat (" Widgets"));
console.log(strl + str2);
注意,无论是 concat() 还是 “ + ”,都不会在字符串之间插入填充字符。如果你想连接多个字符串并且指定它们之间的分隔符(填充字符),则可以使用 Array 对象存储字符串,然后调用 Array 的 join() 方法。
(6)提取子串
ECMAScript String 提供了 slice() 和 substring() 两个方法来提取子串,它们接受一个或两个参数,第一个参数指定起始位置,第二个参数指定结束位置(提取出的子串不包含该位置 的字符),如果忽略第二个参数,结束位置默认为字符串的长度。
slice() 和 substring() 这两个方法的不同之处在于对负数参数的处理。slice() 遇到负数参数时,会应用 “从串尾倒数” 这种策略,比如 slice(-3),会提取母串的后三个字符作为子串; 而 substring() 方法会把负数参数作为 0 处理,还有一点,substring() 总是把较小的参数作为起 始位置,比如 substring(3, 1) 与 substring(1, 3) 效果一样。
还有一个方法,substr() 也可以提取子串,它的第一个参数指定起始位置,第二个参数指定要提取的字符个数,如果不指定,substr() 会返回从起始位置到母串结束的所有字符。 示例代码片段:
var source = new String ("I like QML");
console.log (source.slice (-3)) ; // 输出:"QML"
console.log (source.slice (2,6)); // 输出:"like"
console.log (source.substring (0, 6)); // 输出:"I like"
console.log (source.substring (-3) ); // 输出:"I like QML"
console.log (source.substring (4, -3)); // 输出:"I li"
console.log (source.slice (4, -3)); // 输出:"ke"
console.log (source.substr (2, 4)); // 输出:"like"
(7)大小写转换
如果你想将一个字符串转换为小写,可以使用 toLowerCase() 或 toLocaleLowerCase() 方法:转换为大写,可以使用 toUpperCase() 或 toLocaleUpperCase() 方法。其中 toLocaleXXX 方法基于特定的区域实现,与 localeCompare() 类似。示例代码片段:
var orig = "Qt Quick";
console.log(orig.toLocaleLowerCase());
console.log(orig.toLowerCase());
console.log(orig.toLocaleUpperCase());
console.log(orig.toUpperCase());
(8)字符串替换
replace) 方法可以将母串中的部分子串替换为指定的新字符串。它的第一个参数是一个字符串原始值或者正则表达式,第二个参数是新字符串或产生新字符串的函数。
介绍子串查找时我们用到了正则表达式,这里还要用到,但正则表达式本身是一个非常复杂的主题,后面我们会简要介绍。示例代码片段:
var strSource = new String("Android,best");
// 下面语句输出"iOS,best"
console.log(strSource.replace("Android", "iOS"));
// 下面语句输出"Android,worst”
console.log(strSource.replace(/best/, "worst"));
(9)使用arg()进行值替换
QML 在实现 ECMAScript 时对 String 对象做了扩充,加入了 arg() 方法。如果你用过 Qt C++ 中的 QString 类,对此应不陌生。
arg()的语法:stringarg(value)
。其中 value 可以是数字、字符串、布尔值、对象等,它用来替换发出调用的字符串对象内的 %1、°/2、%N 等占位符;布尔值会被替换为 1 或 0;对于对象,则使用 toString() 方法转换后的结果来替换对应的占位符。arg() 会返回一个新的字符串对象。简单的示例:
var expression = "%1 < %2 = %3";
var result = expression.arg(7).arg(8).arg("true");
console.log(result);
console.log(expression.arg(10).arg(6).arg(false));
console.log("I am %1 years old.".arg(10));
值得注意的是,String 类型的对象是只读的,字符串提取、查找、替换等操作,凡是牵涉到修改的动作,都返回新的字符串原始值或对象,而母串本身不会改变。另外,字符串原始值是伪对象,它可以使用String类的所有属性和方法。
1.3 RegExp
在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。在 QtC++ 中有 QRegExp,在 QML 中有 RegExp,它们是对字符串执行模式匹配的强大工具。
在 ECMAScript 中支持两种构造正则表达式的方法:
- 字面量语法:/pattem/attributes。
- 创建 RegExp 对象:new RegExp (pattern, attributes)。
使用字面量这种方式,我们在上面介绍 String 类的 match() 和 search() 方法时已经用到过。创建 RegExp 对象与字面量方式类似,它们都需要设置 pattern 和 attributes。
1.4 Array
ECMAScript 定义的 Array 是动态数组,其大小可以动态变化。而且数组中的元素,类型可以不同。这和 C++ 这种强类型语言就大大不同了。下面我们来看看 Array 类的一般用法。
(1)创建数组
要定义一个 Array 对象,有三种方式。下面的代码使用默认的构造函数:
var a = new Array();
下面的代码指定数组对象的初始长度:
var a = new Array(10);
下面的代码用给定的参数初始化数组:
var a = new Array(10, 6, 3, 21, 22, 30, 8);
(2)访问数组
Array 类的 length 属性表示数组中元素的个数。数组中的元素,可以通过下标访问。简单的示例代码:
var a = new Array(10, 6, 3, 21, 22, 30, 8);
console.log("array length - ", a.length);
console.log("2nd element - ", a[1]);
(3)修改数组
可以直接使用下标运算符来添加元素,只需指定一个越界的索引即可,比如数组长度为 4,你可以使用a[4]=3
这样的语句来添加一个元素。你还可以使用下标修改已经存在的元素。
可以使用 push() 方法向数组末尾插入一个或多个元素,它返回数组新的长度。你可以使用 Pop() 方法删除并返回数组的最后一个元素。
shift() 方法删除并返回数组的第一个元素。unshift() 方法向数组的开始添加一个元素并返回新的数组长度。
reverse() 方法可以颠倒数组中元素的顺序。注意,它会改变原来的数组。 sort() 方法可以对数组内元素排序并返回对原数组的引用。注意,它会改变原来的数组。 它有一个可选的参数 sortby,让你指定一个比较大小的函数,如果你不指定,QML 的实现是将每个元素转换为字符串,然后根据字符串比较的结果升序排列。
示例代码片段:
var a = new Array(10, 6, 3, 21, 22, 30, "zhangsan");
console.log("array length - ", a.length);
console.log("2nd element - ", a[1]);
console.log("7th - ", a[6]);
a[6] = "ZhangSanFeng";
a[7] = "XieXun"; a.push(250);
a.unshift(1); console.log(a.join(""));
console.log(a.shift ()); a.reverse ();
console.log(a.pop());
console.log(a.sort ());
console.log(a.pop());
console.log(a.pop());
console.log(a.sort());
输出结果如下:
qml: array length w 7
qml: 2nd element ~ 6
qml: 7th _ zhangsan
qml: 1 10 6 3 21 22 30 ZhangSanFeng XieXun 250
qml: 1
qml: 10
qml: [21, 22, 250, 3, 30, 6, XieXun, ZhangSaiiFeng]
qml: ZhangSanFeng
qml: XieXun
qml: [21, 22, 250,3,30,6]
(4)转换为字符串
join() 方法可以把数组中的所有元素组合成一个字符串,字符串之间可以用给定的分隔符来填充。
toString() 方法可以把数组转换为字符串,与不带参数的 join() 方法结果一样。 toLocaIeString() 方法可以把数组转换为本地字符串。
(5)数组分隔与合并
concat() 方法可以连接两个或多个数组,它的参数既可以是一个单一的值,也可以是一个数组对象。它不会改变现有数组,而是返回一个新的数组对象。
slice(start, end) 方法与 String 类的 slice() 方法用法相近,它将母数组中 start 到 end (不含 end 位置的元素)之间的元素放到一个新数组中返回。示例代码片段:
var array = new Array("I", "like", "Qt", "Quick");
var subArray = array.slice(2, 4);
console.log (subArray.join(" "");
var newArray = array.concat ("!", subArray);
console.log(newArray.join(""));
newArray[0] = "Do you";
newArray.splice (4, 3, "?", "Yes", "!");
console.log(newArray.join(""));
输出结果如下:
!qml: Qt Quick
qml: I like Qt Quick J Q+. Quick
qml: Do you like Qt Quick ? Yes !
(6)数组的字面量表示法
除了使用 new 来创建数组对象,还可以使用字面量来表示数组。例如:
var a = [2, 3, 4, "?", "Quick"]
console.log(a.length, a[2]);
如上所示,数组的字面量表示法就这些要点:方括号([])定义一个数组,数组元素(原始值或对象)放在方括号内,多个元素之间使用逗号分隔。
1.5 Math
Math 对象用来执行数学运算,它有点儿特别,你不用使用 new 运算符构造对象,可以直接使用。使用Math对象的代码片段:
var pi = Math.PI;
var textColor = Qt.rgba(Math.random(), Math.random(), Math.random());
Math有下列方法:
max(x, y),返回 x 和 y 中的最大值。
min(x, y),返回 x 和 y 中的最小值。
abs(x),返回数的绝对值。
sqrt(x),返回数的平方根。
pow(x, y),返回 x 的 y 次幕。
random(),返回 0〜1 之间的随机数。
sin(x),返回数的正弦值。
asin(x),返回数的反正弦值。
exp(x),返回 e 的指数。
log(x),返回数的自然对数(底为 e)。
valueOf(),返回 Math 对象的原始值。
1.6 Date
Date 对象用于处理日期和时间。你可以这样创建一个 Date 对象:
var today = new Date();
当使用无参构造函数创建 Date 对象时,该对象会自动把当前日期和时间保存为其初始 值。实际上 Date 对象还可以用下面的方式来创建:
new Date(value);
new Date(datestring);
new Date(year, month, day, hour, minute, second, millisecond);
示例:
var birthdayl = new Date("2009-10-21T22:24:00");
var birthday2 = new Date(2009, 10, 21);
var birthday3 = new Date(2009, 10, 21, 22, 24, 0);
下列方法可以从 Date 对象中提取信息:
getDate(),返回一个月中的某一天(1〜31)。
getDay(),返回一周中的某一天(0〜6)。
getMonth(),返回月份(0〜11)。
getFullYear(),返回4位数字年份。
getHours(),返回小时(0〜23)。
getMinutes(),返回分钟(0〜59)。
getSeconds(),返回秒数(0〜59)。
getMilliseconds(),返回毫秒(0〜999)。
getTime(),返回1970年1月1日至今的毫秒数。
toString(),把日期转换为本地字符串。
简单的示例:
var d = new Date();
console.log(d.toString());
console.log(d.getFullYear(), d.getMonth(), d.getDate());
console.log("since 1970.1.1 - ", d.getTime());
输出结果如下:
qml:周六十月 11 21:15:06 2014 GMT+0800
qml: 2014 - 9 - 11
qml: since 1970.1.1 - 1413033306317
Date 还有一些与 UTC 吋间相关的方法,如 getUTCDate()、getUTCDay()、getUTCMonth() 等。 下列方法可以设置 Date 对象的相关信息:
- seiDate(),设置月的某一天(1〜31)。
- setMonth(),设置月份(0〜11)。
- setFullYear(),设置 4 位数字年份。
- setHours(),设置小时(0〜23)。
- setMinutes(),设置分钟(0〜59)。
- setSeconds(),设置秒钟(0〜59)。
- setMilliseconds(),设置毫秒(0〜999)。
- setTime(),以1970年1月1日至今的毫秒数设置 Date 对象。
Date 还有一些静态方法,不需要创建 Date 对象就可以使用,比如:
Date.now() 方法,返回从1970年1月1日凌晨至今的毫秒数。
Date.parse() 方法,解析一个时间字符串,返回那个时间距离1970年1月1日凌晨至今的毫秒数
Date.UTC(),解析 UTC 时间,返回那个时间距离1970年1月1日凌晨至今的毫秒数,它的参数是整型的年、月、日、时、分、秒、毫秒,至少提供年、月,就像构造函数一样。
看一个使用 Date.now() 计算耗时的小示例:
var start = Date.now();
for(var i = 0; i < 10000000; i++);
var end = Date.now();
var elapsed = end - start;
console.log(elapsed);
Date 还有很多其他的方法,可以参考 Qt 帮助,请在索引模式下以 “Date” 为关键字检索。
1.7 你不可不知的对象碎碎念
在 ECMAScript 中,类(对象定义)是一个模板,它实例化之后,就是对象。对象由特性构成,特性可以是原始值,也可以是引用值。如果特性存放的是函数,它将被看作对象的 方法,否则该特性被看作对象的属性。
换个角度来说,类定义了一个属性和方法的集合,作为构建对象的模板,使用new运算符构造对象的过程被称为实例化,而对象也经常被称为类的实例。
下面的代码,根据类Array实例化了一个对象array:
var array = new Array();
如你所见,对象是用 new 运算符后跟要实例化的类的名字来创建的。array 是一个引用 值,相当于 C++ 中的指针,它只是作为一个引用指向实际的物理对象。每次创建对象,存储 在变量中的都是该对象的引用,而不是对象本身。
C++ 前辈们一两告诫,new 出来的对象一定要 delete。这是 C++ 的游戏规则,ECMAScript 不是这样的!像 Java 一样,ECMAScript 有垃圾收集器(GC,Garbage Collection),当没有任何引用指向一个对象时,该对象就可以被垃圾收集器回收、销毁。而垃圾收集器可能在函数执行完毕后运行,也可能在实现 ECMAScript 的引擎觉得必要时运行。
把对象的引用设置为 null,就可以解除对对象的引用。例如:
var array = new Array();
array = null;
如果把对象的所有引用都设置为 null,该对象就被废除了,下次垃圾收集器运行时,就会销毁对象。每用完一个对象,就通过设置引用为 null 来废除它,是个好习惯。
二、内置对象
ECMAScript 的内置对象,指的是那些不需要实例化就可以使用的本地对象,ECMAScript 5 定义了三个内置对象:Global、Math 和 JSON。Math我们前面己经介绍过 了,下面我们重点讲 Global,另外这里不再讲解 JSON。
Global 对象
Global 对象非常特别,实际上,它是一个并不存在的对象! ECMAScript 有个有趣的概念:没有独立的函数和属性,所有的属性和函数都从属于某个对象。因此,Global 对象应运 而生,接管了那些无家可归的属性和函数。
例如 NaN、Infinity、undefined 都是 Global 对象的属性;所有本地对象的构造函数,像 Object、Array、String、Date、RegExp 等,都是 Global 对象的属性,完整的列表请参考 Qt 帮助中的 ECMAScript Reference。
isNaN()、isFinite()、parselnt()、parseFloat(),都是 Global 对象的方法。最后要说的,也是最彪悍的一个方法:eval() 方法。它用来执行一段 ECMAScript,可以 说它就是个 ECMAScript 解释器。例如:
console.log(eval("5 + 2")); // 输出:7
再看:
var s = "8+7";
console.log(eval(s)); // 输出:15
var s2 = new String("9+10");
console.log(eval(s2)); // 输出:9+10
注意,eval() 的参数是字符串,并且只能是原始字符串,如果你传递一个 String 对象给 它,它会原封不动地返回给你。
三、宿主对象 Qt
Qt 是 QML 提供的一个全局宿主对象,整合了常用的属性、方法和枚举类型,方便开发者引用。
1. Qt对象的属性
(1)application 属性
Qt.application 是一个对象,可以通过它访问应用的全局状态。
application.state 表示应用状态,有 Qt.ApplicationActive、Qt.Applicationlnactive、Qt.ApplicationSuspended、Qt.ApplicationHidden,你可以望文生义,或者查阅 Qt 帮助来了解详情。
application.layoutDirection 代表布局方向,可以取 Qt.LeftToRight、Qt.RightToLeft。
application.arguments 存储应用启动吋的参数。
application 还有 application.name、application.version、application.organization、application.
domain 这些属性,请查阅 Qt 帮助。
- application 有一个信号,aboutToQuit(),在应用要退出时发射,你可以连接它来做一些清 理工作。它与 QCoreApplication 的 aboutToQuit() 是一个东西。
(2)platform 属性
application.platform 是一个对象,platform.os 存储操作系统的名字,可能是:
"linux” - Linux
"windows” - Windows
"osx" - OS X
Qt 还有 inputMethod 属性,详情请参考 Qt 帮助。
2. Qt对象的枚举类型
Qt 对象包含非常多的枚举值,你在 Qt 帮助的索引模式下按关键字 “Qt Namespace” 检索。
按键枚举类型:Qt.Key_0、Qt.Key_Emer、 Qt.Key Home 等。
应用状态:Qt.ApplicationActive、Qt.Applicationlnactive 等。
布局方向:Qt.LeftToRight、Qt.RightToLeft 等。
窗口模态:Qt.NonModal、Qt.ApplicationModal、Qt.WindowModal。
窗口类型标记,Qt.Window、Qt.Tool Window 对象的 flags 属性就从这些值中取值。
鼠标事件中,可以使用Qt.LeftButton、Qt.RightButton....
3. Qt对象的方法
Qt 对象有一长串的方法,咱们分类来看看。
(1)用于创建宿主类型
我们可以使用 Qt 对象提供的方法来创建某些 QML 提供的类型,用于给 Item 等对象的 某些属性赋值,比如我们前面用过的 Qt.rgba()。下面是完整的列表:
- Qt.rect() 创建 rect 实例。
- Qt.point() 创建 point 实例。
- Qt.size() 创建 size 实例。
- Qt.rgba()、Qt.hsla()、Qt.darker()、Qt.lighter()、Qt.tint() 等创建 color 类型的颜色值。
- Qt.font() 创建字体。
- Qt.vector2d() 创建 vector2d。
(2)格式化日期、时间
Date 类的 toLocaleString() 等 toLocaleXXX 系列方法有时也满足不了大家伙千奇百怪的奇葩需求,因此 Qt 对象提供了几个方法用来格式化日期和时间。它们是:
string Qt.formatDateTime(datetime date, variant format)
string Qt.formatDate(datetime date, variant format)
string Qt.formatTime(datetime date, variant format)
说下 format,简单地讲,你可以用类似于 “yyyy-MM-ddhh:mm:ss.zzz” 之类的字符串来描述日期和时间的输出格式。举个简单的例子:
var today = new Date();
console.log(Qt.formatDateTime(today, "yyyy-MM-dd hh:mm:ss.zzz"));
上面的代码将当前日期输出为类似于下面的字符串:
2014-08-22 14:51:05.406
(3)动态对象创建
对象动态创建,就会用到 Qt 对象提供的两个方法,它们是:
- object Qt.createComponent(url)
- object Qt.createQmlObject(string qml, object parent, string filepath)
具体怎么用,这里不再赘述。
(4)其他方法
“其他” 一直是个不可思议的词儿,无法分类的东西都可以归到它下面。Qt 对象还提供这些方法:
Qt.quit(),退出应用,熟悉吧。
StringQt.md5(string),计算字符串的 MD5 值,返回的也是字符串。
stringQt.resolvedUrl(url),将传入的相对路径转换为全路径。
参考:
《Qt Quick 核心编程》第5章 ECMAScript初探
ECMAScript 初探 - 对象篇的更多相关文章
- ECMAScript 初探 - 基础篇
ECMAScript 语言的标准是由 Netscape.Sun.微软.Borland 等公司基于 JavaScript 和 JScript 锤炼.定义出来的. ECMAScript 仅仅是一个描述,定 ...
- [java初探总结篇]__java初探总结
前言 终于,java初探系列的学习,要告一阶段了,java初探系列在我的计划中是从头学java中的第一个阶段,知识主要涉及java的基础知识,所以在笔记上实在花了不少的功夫.虽然是在第一阶段上面花费了 ...
- [Effective Java] 创建和销毁对象篇
[Effective Java] 创建和销毁对象篇 1. 优先考虑用静态工厂方法代替构造器 优点: - 静态工厂方法相比于构造器,它们有名称 - 不需要每次在使用的时候创建一个对象 - 可以返回原返回 ...
- 转载C#函数式程序设计初探——基础理论篇
转载网址:http://www.cnblogs.com/Hlia/archive/2013/04/20/3029701.html 个人认为,C#语言的某些设计并不非常适合函数式开发,比如它的类型推断并 ...
- JavaScript 精髓整理篇之一(对象篇)postby:http://zhutty.cnblogs.com
废话篇头: 由于工作关系,所以写博文的时间有那么点~~,其实是输入法太懒了,都是输入法的错~~ 这一系列的博客将总结所有关于JavaScript语言的精髓,适合0基础到大师级别人物阅读. <Ja ...
- ECMAScript arguments 对象(摘自W3C)
arguments 对象 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 message.用 argument ...
- JavaScript学习系列之执行上下文与变量对象篇
一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 在上一篇文章中讲解了JavaScript内存模型,其中有提到执行上下文与变量对象的概念.对于JavaScript开发者来说,理解执行上下文与变 ...
- 当Java遇见了Html--Jsp九大内置对象篇
jsp内置对象对象是web容器创建的一组对象,不使用new关键词久可以使用的内置对象. 九大内置对象包括以下: out --JspWriter request --ServletRequest rep ...
- Redis之对象篇——Redis对象系统简介
Redis之对象篇--Redis对象系统简介 前言 之前几篇文章,简单介绍 Redis用到的所有主要数据结构,简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合.跳跃表. 图解Red ...
随机推荐
- NLP第二课(搜索)
最近压力太大了,持续性修改0注释的代码,变量为阿拉伯数字的代码,压力山大,摆正心态,没有那些bug,还需要我们来做些什么呢?如果一个特别出色的项目,也体现不出来你个人的出色.几句牢骚,我们今天来继续说 ...
- 练手WPF(四)——贪吃蛇小游戏的简易实现(下)
八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...
- 【转载】Visual Studio中WinForm窗体程序如何切换.NET Framework版本
在C#语言的WinForm窗体程序中,有时候我们需要切换WinForm窗体程序项目的.NET Framework版本号,例如从.NET Framework 4.5版本切换到.NET Framework ...
- 腾讯WeTest&TesterHome深圳线下沙龙
腾讯官方的一站式品质开放平台「腾讯WeTest」携手知名测试社区「TesterHome」以及3家金融相关企业为我们带来的金融专场. 本次活动内容主要以金融公司的测试落地和测试技术为主,我们希望你是一个 ...
- odoo12 如何设置超级用户
在odoo12的版本中,和之前的版本有点不一样的地方 在odoo12版本之前,每个实例都是使用户名为Administrator的默认用户来创建的. 在数据库中user_id是1. 在代码中,你会发现 ...
- 【学习笔记】兄弟连LINUX视屏教程(沈超 李明)
发现自己的linux水平楞个瓜皮,找个视屏教程学习一哈 1 linux系统简介 1.1 UNIX和Linux发展史 unix发展历史:1969年,美国贝尔实验室的肯.汤普森开发出unix系统,1971 ...
- ZKEACMS 无法运行问题汇总
前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...
- constant timer(固定定时器),constant throughput timer(常数吞吐量定时器);多个请求,某个请求a下,设置常数吞吐量定时器,模式:all active threads(shared)则所有请求吞吐量一致;
1.两请求之间添加'固定定时器' 1000ms,那么两请求发送间隔时间是多少? 1000ms吗? 由实验得出,2个请求发送间隔时间 = 1000ms + 第一个请求时间(发出至完成后时间) 2.单个请 ...
- c# 第14节 字符方法、转义字符、字符串的方法
本节内容: 1:字符的定义 2:字符的方法 3: 转义字符 4:字符串简介 5:字符串方法 1:字符的定义 char与Unicode一一对应,一个char 2个字节. 2:字符的使用方法: 实例: s ...
- 201871020225-牟星源《面向对象程序设计(java)》第十一周学习总结
201871020225-牟星源<面向对象程序设计(java)>第十一周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu ...