通过测试了解javascript变量范围

时间:2014-06-28 16:45:31

标签: javascript node.js mocha

我正在尝试测试Map类。我的类有一个方法getCenter()返回{x:0,y:0}。另外,我想让{x:1,y:0}调用getRight(),我仍然希望getCenter()返回{x:0,y:0}。

var assert = require('assert')
    , Map = require('../lib/map')

describe('Map()', function () {
    describe('#getCenter()', function () {
        it('should return [0,0] by default', function () {
            var map = new Map()
            assert.deepEqual({x: 0, y: 0}, map.getCenter())
        })
    })
    describe('#getRight()', function () {
        it('should return [1,0] by default', function () {
            var map = new Map()
            assert.equal(1, map.getRight().x)
            assert.deepEqual({x: 0, y: 0}, map.getCenter())
        })
    })
})

但我做错了什么:

var Map = function () {
    this.center = {x: 0, y: 0}
}

module.exports = Map

Map.prototype.getCenter = function () {
    return this.center
}

Map.prototype.getRight = function () {
    var new_position = this.center
    new_position.x += 1
    return new_position
}

我不想改变这个。中心。如何创建新变量?我不明白“this.center”的范围。我没有改变那个变量。

2 个答案:

答案 0 :(得分:1)

您需要复制,而不仅仅是制作参考。对象和数组在JS中通过引用传递。

var new_position = {x:this.center.x,y:this.center.y};

答案 1 :(得分:1)

因为javascript基于C而且很疯狂,所以将一个变量赋给一个对象实际上将它设置为指向该对象的指针(这也适用于数组,这就是你需要调用var b = a.splice()的原因。所以,你需要克隆对象(这很难做得很好:How do I correctly clone a JavaScript object?)或者直接将新变量设置为属性: return {x: this.center.x + 1, y: this.center.y}