Как я могу утверждать, что функция, переданная конструктору класса, передается по ссылке и не дублируется при использовании композиции? - PullRequest
0 голосов
/ 14 июня 2019

В приведенном ниже коде я легко могу утверждать, что zombie является экземпляром Zombie.

Когда создается zombie, ему отправляется функция bitmapRenderer и становится функцией render() внутри `Zombie '.

Я предполагаю, что, поскольку 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);

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Просто используйте 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 голос
/ 14 июня 2019

Вам не нужно проверять это в классе Зомби.
Что может быть проверено, так это потребитель Zombie.
Вероятно, у вас будет отдельный модуль с фабрикой, которая будет создавать для вас зомби.

import Zombie from 'models/zombie`;

function spawnZombie () {
  return new Zombie(bitmapRenderer);
}

При тестировании этого модуля вы должны смоделировать Zombie, чтобы вы могли отследить, как он был создан.
В частности, вы проверите, что аргумент renderer является ссылкой на ваш bitmapRenderer.


Сложение.

Но если вы не хотите сильно менять свой код и сохранять его, как в своем примере, вы можете просто проверить, что zombie.renderer === bitmapRenderer.
Это просто общедоступное поле в вашем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...