我正在尝试测试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”的范围。我没有改变那个变量。
答案 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}