表示2D笛卡儿坐标点的对象
这个对象用普通数据属性保存点的x和y坐标,用访问器属性给出与这个点等价的极坐标:
let p = {
// x和y是常规的可读写数据属性
x: 1.0,
y: 1.0,
// r是由获取方法和设置方法定义的可读写访问器属性
// 不要忘了访问器方法后面的逗号。
get r() { return Math.hypot(this.x, this.y); },
set r(newvalue) {
let oldvalue = Math.hypot(this.x, this.y);
let ratio = newvalue/oldvalue;
this.x *= ratio;
this.y *= ratio;
},
// theta是一个只定义了获取方法的只读访问器属性
get theta() { return Math.atan2(this.y, this.x); }
};
p.r // => Math.SQRT2
p.theta // => Math.PI / 4
注意这个示例的获取和设置方法中使用了关键字this。JavaScript会将这些函数作为定义它们的对象的方法来调用。这意味着这些函数体内,this引用的是表示坐标点的对象p。因此访问器属性r的获取方法可以通过this.x和this.y来引用坐标点的x和y属性。
与数据属性一样,访问器属性也是可以继承的。因此,可以把上面定义的对象p作为其他点的原型。可以给新对象定义自己的x和y属性,而它们将继承r和theta属性:
let q = Object.create(p); // 一个继承获取和设置方法的新对象
q.x = 3; q.y = 4; // 创建q的自有数据属性
q.r // => 5: 可以使用继承的访问器属性
q.theta // => Math.atan2(4, 3)
以上代码使用访问器属性定义了一个API,提供了一个数据集的两种表示(笛卡儿坐标和极坐标)。