1

大家好,我有以下代码

POINT = function () {
    that = {};
    that.x = 0; that.y = 0;

    that.setPoint = function (x, y) {
        that.x = x;
        that.y = y;
    };

    that.toString = function () {
        return that.x + ',' + that.y + ' ';
    };    

    return that;
};

PEN = function () {
    var that = {};
    var points = [];
    var buffer_size = 5, head = -1, length = 0;

    // Init buffer
    for (var i = 0; i < buffer_size; i++) {
        points.push(POINT());
    }

    that.addPoint = function (x, y) {
        head = (head + 1) % buffer_size;
        points[head].setPoint(x, y);
        if (length < buffer_size) {length++;}
    };

    that.toString = function (path) {
        var d = '';
        for (var i = 0; i < length; i++) {
            var index = (head - i) < 0 ? buffer_size + (head - i) : (head - i);
            d += points[index].toString();
        }
        return d;
    };

    return that;
};

// Initialization
var i = 0, pen = PEN();

for (var i = 0; i < 10; i++) {
    pen.addPoint(i + 1, i + 1);
}

alert(pen.toString()); // RESULT 10,10 10,10 10,10 10,10 10,10

points数组中填充了正确的pen对象,但函数setPoint始终指向数组pen中的最后一个对象points

注意:我想要直接访问xy协调,因此我没有使用 var 声明xy作为“本地”变量。

在这里可以找到带有示例的小提琴:http: //jsfiddle.net/DNVjy/2/

4

3 回答 3

3

你应该把你的变量放到一个变量上:-)

现在,您正在窗口对象上定义函数和本地“那个”。现在不需要“那个”了。

尝试这个:

function POINT() {

    this.x = 0; this.y = 0;

    this.setPoint = function (x, y) {
        this.x = x;
        this.y = y;
    };

    this.toString = function () {
        return this.x + ',' + this.y + ' ';
    };    

    return this;
};

function PEN() {
    var points = [];
    var buffer_size = 5, head = -1, length = 0;

    // Init buffer
    for (var i = 0; i < buffer_size; i++) {
        points.push(new POINT());
    }

    this.addPoint = function (x, y) {
        head = (head + 1) % buffer_size;
        points[head].setPoint(x, y);
        if (length < buffer_size) {length++;}
    };

    this.toString = function (path) {
        var d = '';
        for (var i = 0; i < length; i++) {
            var index = (head - i) < 0 ? buffer_size + (head - i) : (head - i);
            d += points[index].toString();
        }
        return d;
    };

    return this;
};

你现在像这样声明一支笔:

var pen = new PEN();

(还要注意new POINT()PEN“类”中的关键字)。

于 2013-05-28T07:05:00.090 回答
2

更改thatPOINT局部变量(放在var它前面)会将输出更改为:
10,10 9,9 8,8 7,7 6,6

希望这是您所期待的。更新小提琴:http: //jsfiddle.net/DNVjy/3/

于 2013-05-28T07:04:27.093 回答
1

that的 inPOINT不应该是全球性的!每次创建一个全局变量时都会覆盖相同的全局变量,因此它们都引用同一对值。

FWIW,为什么不按照预期的方式使用 JS 对象呢?

function POINT() {
    if (this instanceof POINT) {
        this.x = 0; this.y = 0;
    } else {
        return new POINT();   // allow creation without "new"
    }
};

POINT.prototype.setPoint = function (x, y) {
    this.x = x;
    this.y = y;
};

POINT.prototype.toString = function () {
     return this.x + ',' + this.y + ' ';
};    

您正在使用的模块模式对于许多目的来说都是次优的:

  • 每个实例都有自己的方法副本,而不是共享它们
  • 返回的对象没有特定的“类型”
于 2013-05-28T07:01:53.153 回答