在下面的代码中,我可以轻松断言zombie
是Zombie
的实例。
创建zombie
时,会将功能bitmapRenderer
发送给它,并成为“僵尸”内部的功能render()
。
我假设由于bitmapRenderer
是一个函数(它是一个对象),因此它通过引用传递。我可以创建任意数量的僵尸,而不必再创建任何bitmapRenderer
函数,不会浪费任何内存,但是如何通过断言证明这一点呢?
function bitmapRenderer(drawable) {
console.log('I am bitmapRenderer function', drawable);
}
class Zombie {
constructor(renderer) {
this.renderer = renderer;
this.x = 100;
this.y = 100;
this.name = 'zombie';
}
render() {
this.renderer(this);
}
}
const zombie = new Zombie(bitmapRenderer);
console.assert(zombie instanceof Zombie);
答案 0 :(得分:2)
只需使用console.log(zombie.renderer === bitmapRenderer);
这证明了它们是相同的,因为即使对象具有相同的属性,除非它们具有相同的引用,否则它们始终将被视为不相等。
var obj1 = { "a": "A" };
var obj2 = { "a": "A" };
console.log(obj1 === obj2); // false
var obj3 = obj2;
console.log(obj2 === obj3); // true
答案 1 :(得分:1)
您无需在Zombie类中进行测试。
可以测试的是Zombie
的使用者。
您可能会有一个带有工厂的单独模块,该工厂将为您创建僵尸。
import Zombie from 'models/zombie`;
function spawnZombie () {
return new Zombie(bitmapRenderer);
}
在测试此模块时,您应该模拟Zombie
,以便可以跟踪其实例化方式。
具体来说,您将检查renderer
参数是否是对bitmapRenderer
的引用。
添加。
但是,如果您不想大量更改代码并将其保留为示例中的样式,则只需检查zombie.renderer === bitmapRenderer
。
这只是您课堂上的一个公共领域。