属性(property)

 属性可以像变量那样进行读写,但实际上,在读写时会像调用函数那样调用设置函数 ( setter ) 和读取函数 ( getter ) 。设置函数 和 读取函数有时也被称为 属性控制器。

 定义格式如下。

property 标识符
{
    setter(参数)
    {
        // 这里是设定函数的内容
    }

    getter()
    {
        // 这里是读取函数的内容
        return 表达式; // 读取函数的返回值
    }
}

 把 setter 和 getter 的书写顺序反过来也没问题。
 即使在类中定义了 property 或者把属性注册为全局对象的成员,属性标识符中的值也要通过读取函数来取得,通过设置函数来设置。设置函数和读取函数和方法一样可以包含各种各样的内容。设置函数通过写在 setter 后面的 ( ) 里的参数来接受变量作为属性的值。读取函数通过 return 语句将属性的值返回。

 getter后面的 () 可以省略。

 如果将对应一个标识符的设置函数和读取函数都写出来,这个标识符就成了即可读又可写的属性。如果只写出其中一个,例如只写了读取函数的时候,这个标识符就成了只读属性了,对它进行写入时会产生错误。

例:
    var value;

    property property1 // 声明属性 'property1' 
    {
        setter(v)
        {
            // 设置函数只接受一个参数
            value=v; // 处理参数 v 

            inform("value set.");
        }

        getter
        {
            // 声明 'property1' 的读取函数
            // 读取函数没有参数
            inform("value get.");
            return value; // 把 value 作为返回值
        }
    }

    property1=5; // 向 property1 带入数值会调用读取函数
    property1++; // 像这样的表达式会先调用读取函数,
                 // 然后调用设置函数来设置新值。
}

 属性也和变量、函数、类一样,可以被覆盖。

属性对象(property object)

 属性本身也是一个对象。但是,无论注册到什么对象中,普通的操作方式只是会调用属性控制器,而无法对属性对象本身进行操作。
 使用 & 运算符可以取出属性对象。取出的属性对象能够代入到局部变量中。
 还有,使用 & 运算符也可以把属性对象注册到别的对象中。

例:
    property prop // 声明属性 prop 
    {
        (略)
    }

{
    var p = ∝ // 获得属性对象并将其代入到局部变量中

    &object.property1 = p; // 将 p 注册为 object 的 property1 
}


 使用 & 运算符可以不触动读取函数和设置函数,直接对属性对象本身进行操作。不使用 & 运算符的话,则是对属性的普通的操作(读或写)。

 已经被取出并变为局部变量的的属性对象,虽然没有注册到某个对象中,但是使用 * 运算符仍可以调用它的属性控制器。


例:
    property prop // 声明属性 prop 
    {
        (略)
    }

{
    var p = ∝ // 获得属性对象并将其代入到局部变量中

    *p = 30; // 调用 setter 将属性的值设定为 30 
    func(*p); // 调用 getter 获得属性的值并传入 func 函数
}


Note
像上面那样使用 var 变量保存属性对象时,请使用局部变量。这是因为,属性对象一旦注册到某个对象中,它就不会作为属性对象,而是作为属性经由读取函数和设置函数来工作。换句话说,不作为局部变量,而是作为全局变量(=global的成员)或者对象的成员来注册的话,它就会像普通的属性那样工作。当然,可以使用 & 运算符把注册为全局变量或对象的成员的属性对象取出来。


对属性对象使用 instanceof 运算符和 "Property" 操作数,结果为真(以上面那个为例,&prop instanceof "Property" 的值为真)。