人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

表示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,提供了一个数据集的两种表示(笛卡儿坐标和极坐标)。

posted @ 2022-03-11 15:42  0a  阅读(32)  评论(0编辑  收藏  举报