DevLog

๊ฐ์ฒด koans ๋ณธ๋ฌธ

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ๊ฐœ๋ฐœ/javascript

๊ฐ์ฒด koans

Seungjae Lee 2021. 5. 27. 09:39
describe('Object์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.', function () {

  it('Object์˜ ๊ธฐ๋ณธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.', function () {
    const emptyObj = {};
    expect(typeof emptyObj === 'object').to.equal(true);
    expect(emptyObj.length).to.equal(undefined);

    const megalomaniac = {
      mastermind: 'Joker',
      henchwoman: 'Harley',
      getMembers: function () {
        return [this.mastermind, this.henchwoman];
      },
      relations: ['Anarky', 'Duela Dent', 'Lucy'],
      twins: {
        'Jared Leto': 'Suicide Squad',
        'Joaquin Phoenix': 'Joker',
        'Heath Ledger': 'The Dark Knight',
        'Jack Nicholson': 'Tim Burton Batman',
      },
    };

    expect(megalomaniac.length).to.equal(undefined);
    expect(megalomaniac.mastermind).to.equal('Joker');
    expect(megalomaniac.henchwoman).to.equal('Harley');
    expect(megalomaniac.henchWoman).to.equal(undefined);
    expect(megalomaniac.getMembers()).to.deep.equal(['Joker', 'Harley']);
    expect(megalomaniac.relations['2']).to.equal('Lucy');
    expect(megalomaniac.twins['Heath Ledger']).to.deep.equal('The Dark Knight');
  });

  it('Object์˜ ์†์„ฑ(property)๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.', function () {
    const megalomaniac = { mastermind: 'Agent Smith', henchman: 'Agent Smith' };

    expect('mastermind' in megalomaniac).to.equal(true);

    megalomaniac.mastermind = 'Neo';
    expect(megalomaniac['mastermind']).to.equal('Neo');

    expect('secretary' in megalomaniac).to.equal(false);

    megalomaniac.secretary = 'Agent Smith';
    expect('secretary' in megalomaniac).to.equal(true);

    delete megalomaniac.henchman;
    expect('henchman' in megalomaniac).to.equal(false);
  });

  it("'this'๋Š” method๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.", function () {
    const currentYear = new Date().getFullYear();
    const megalomaniac = {
      mastermind: 'James Wood',
      henchman: 'Adam West',
      birthYear: 1970,
      calculateAge: function (currentYear) {
        return currentYear - this.birthYear;
      },
      changeBirthYear: function (newYear) {
        this.birthYear = newYear;
      },
    };

    expect(currentYear).to.equal(2021);
    expect(megalomaniac.calculateAge(currentYear)).to.equal(51);

    megalomaniac.birthYear = 2000;
    expect(megalomaniac.calculateAge(currentYear)).to.equal(21);

    megalomaniac.changeBirthYear(2010);
    expect(megalomaniac.calculateAge(currentYear)).to.equal(11);

    /*
    object method๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์œผ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ method์˜ ํ˜ธ์ถœ์€ 'object.method()'์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    'this'๋Š” method๋ฅผ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— method๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.
    */
  });

  it('๊ฐ์ฒด์˜ method๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.', function () {
    const megalomaniac = {
      mastermind: 'Brain',
      henchman: 'Pinky',
      getFusion: function () {
        return this.henchman + this.mastermind;
      },
      battleCry(numOfBrains) {
        return `They are ${this.henchman} and the` + ` ${this.mastermind}`.repeat(numOfBrains);
      },
    };

    expect(megalomaniac.getFusion()).to.deep.equal('PinkyBrain');
    expect(megalomaniac.battleCry(3)).to.deep.equal('They are Pinky and the Brain Brain Brain');
  });

  it('Object๋ฅผ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ, reference๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.', function () {
    const obj = {
      mastermind: 'Joker',
      henchwoman: 'Harley',
      relations: ['Anarky', 'Duela Dent', 'Lucy'],
      twins: {
        'Jared Leto': 'Suicide Squad',
        'Joaquin Phoenix': 'Joker',
        'Heath Ledger': 'The Dark Knight',
        'Jack Nicholson': 'Tim Burton Batman',
      },
    };

    function passedByReference(refObj) {
      refObj.henchwoman = 'Adam West';
    }
    passedByReference(obj);
    expect(obj.henchwoman).to.equal('Adam West');

    const assignedObj = obj;
    assignedObj['relations'] = [1, 2, 3];
    expect(obj['relations']).to.deep.equal([1, 2, 3]);

    const copiedObj = Object.assign({}, obj);
    copiedObj.mastermind = 'James Wood';
    expect(obj.mastermind).to.equal('Joker');

    obj.henchwoman = 'Harley';
    expect(copiedObj.henchwoman).to.equal('Adam West');

    delete obj.twins['Jared Leto'];
    expect('Jared Leto' in copiedObj.twins).to.equal(false);

    /*
    ๋งˆ์ง€๋ง‰ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ฌ๋ž์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    'Object.assign'์„ ํ†ตํ•œ ๋ณต์‚ฌ๋Š” reference variable์€ ์ฃผ์†Œ๋งŒ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 
    ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์–•์€ ๋ณต์‚ฌ(shallow copy)์™€ ๊นŠ์€ ๋ณต์‚ฌ(deep copy)์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
    ๊ฐ€์ด๋“œ๊ฐ€ ๋  ๋งŒํ•œ ํ•™์Šต์ž๋ฃŒ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
      https://scotch.io/bar-talk/copying-objects-in-javascript
      https://medium.com/watcha/๊นŠ์€-๋ณต์‚ฌ์™€-์–•์€-๋ณต์‚ฌ์—-๋Œ€ํ•œ-์‹ฌ๋„์žˆ๋Š”-์ด์•ผ๊ธฐ-2f7d797e008a
    */
  });
});
Comments