属性(property)
属性可以像变量那样进行读写,但实际上,在读写时会像调用函数那样调用设置函数 ( setter ) 和读取函数 ( getter ) 。设置函数 和 读取函数有时也被称为 属性控制器。
定义格式如下。
property标识符
{
setter(参数)
{
//这里是设定函数的内容
}
getter()
{
//这里是读取函数的内容
return表达式;//读取函数的返回值
}
}
把 setter 和 getter 的书写顺序反过来也没问题。
即使在类中定义了 property 或者把属性注册为全局对象的成员,属性标识符中的值也要通过读取函数来取得,通过设置函数来设置。设置函数和读取函数和方法一样可以包含各种各样的内容。设置函数通过写在 setter 后面的 ( ) 里的参数来接受变量作为属性的值。读取函数通过 return 语句将属性的值返回。
getter后面的 () 可以省略。
如果将对应一个标识符的设置函数和读取函数都写出来,这个标识符就成了即可读又可写的属性。如果只写出其中一个,例如只写了读取函数的时候,这个标识符就成了只读属性了,对它进行写入时会产生错误。
例:
varvalue;
propertyproperty1//声明属性'property1'
{
setter(v)
{
//设置函数只接受一个参数
value=v;//处理参数v
inform("valueset.");
}
getter
{
//声明'property1'的读取函数
//读取函数没有参数
inform("valueget.");
returnvalue;//把value作为返回值
}
}
property1=5;//向property1带入数值会调用读取函数
property1++;//像这样的表达式会先调用读取函数,
//然后调用设置函数来设置新值。
}
属性也和变量、函数、类一样,可以被覆盖。
属性对象(property object)
属性本身也是一个对象。但是,无论注册到什么对象中,普通的操作方式只是会调用属性控制器,而无法对属性对象本身进行操作。
使用 &
运算符可以取出属性对象。取出的属性对象能够代入到局部变量中。
还有,使用 &
运算符也可以把属性对象注册到别的对象中。
例:
propertyprop//声明属性prop
{
(略)
}
{
varp=∝//获得属性对象并将其代入到局部变量中
&object.property1=p;//将p注册为object的property1
}
使用 &
运算符可以不触动读取函数和设置函数,直接对属性对象本身进行操作。不使用 &
运算符的话,则是对属性的普通的操作(读或写)。
已经被取出并变为局部变量的的属性对象,虽然没有注册到某个对象中,但是使用 *
运算符仍可以调用它的属性控制器。
例:
propertyprop//声明属性prop
{
(略)
}
{
varp=∝//获得属性对象并将其代入到局部变量中
*p=30;//调用setter将属性的值设定为30
func(*p);//调用getter获得属性的值并传入func函数
}
Note
像上面那样使用 var 变量保存属性对象时,请使用局部变量。这是因为,属性对象一旦注册到某个对象中,它就不会作为属性对象,而是作为属性经由读取函数和设置函数来工作。换句话说,不作为局部变量,而是作为全局变量(=global的成员)或者对象的成员来注册的话,它就会像普通的属性那样工作。当然,可以使用 & 运算符把注册为全局变量或对象的成员的属性对象取出来。
对属性对象使用 instanceof 运算符和 "Property" 操作数,结果为真(以上面那个为例,&prop instanceof "Property" 的值为真)。