我可以将混合模式与二传手和吸气手一起使用吗?

Can I use the mixin pattern with setters and getters

本文关键字:一起 混合 模式 二传手 我可以      更新时间:2023-09-26
;
"use strict";
function IPoint() {
  this.getDistance = function(point) {
    var x = this.x - point.x;
    var y = this.y - point.y;
    return Math.sqrt(x * x + y * y);
  };
  this.isAbove = function(point) {
    if (this.y <= point.y) {
      return true;
    } else {
      return false;
    }
  };
  this.isBelow = function(point) {
    if (this.y >= point.y) {
      return true;
    } else {
      return false;
    }
  };
  this.isLeftOf = function(point) {
    if (this.x <= point.x) {
      return true;
    } else {
      return false;
    }
  };
  this.isRightOf = function(point) {
    if (this.x >= point.x) {
      return true;
    } else {
      return false;
    }
  };
};
var Point = function(x, y) {
  this.x = x;
  this.y = y;
  IPoint.call(this);
};
Point.prototype =
  Object.create(null,
                {
                  get x() {
                    return this._x;
                  },
                  set x(v) {
                    this._x = v;
                  },
                  get y() {
                    return this._y;
                  },
                  set y(v) {
                    this._y = v;
                  },
                });
给我错误未

捕获的类型错误:属性描述必须是对象:未定义的几何.js:47(匿名函数(。这给我的印象是,我不能在 dot.create 中传递的对象中使用二传手和 getter,但我不知道为什么。我做错了什么?

Object.create确实将属性描述符的对象作为其第二个参数,就像defineProperties一样。正确的语法是

Point.prototype = Object.create(null, {
    x: {
        get: function() { return this._x; },
        set: function(v) { this._x = v; },
        // configurable: true,
        // enumerable: true
    },
    x: {
        get: function() { return this._y; },
        set: function(v) { this._y = v; },
        // configurable: true,
        // enumerable: true
    }
});

但是,我看不出为什么Point不应该从Object继承,所以就让它

Point.prototype = {
    get x() { return this._x; },
    set x(v) { this._x = v; },
    get y() { return this._y; },
    set y(v) { this._y = v; }
};