|
| 1 | +JavaScript는 'duck' 타이핑을 구현합니다. 덕 타이핑은 동적 타이핑의 형식입니다. 이는 특정 클래스에서 상속하거나, 특정 인터페이스에서 구현하는 대신, 객체의 메소드에서 바른 형식인지 파악합니다. 이 개념의 이름은 James Whitcomb Riley가 만든 덕 데스트에 기인하고 다음 문장으로 요약할 수 있습니다. |
| 2 | + |
| 3 | + "오리처럼 걷고, 오리처럼 수영하고, 오리처럼 꽥꽥대는 새가 있다면, 나는 그 새를 오리라 부르겠다" |
| 4 | + |
| 5 | +JavaScript에서 탄탄한 프로그램을 작성하려다보면 종종 객채가 우리가 원하는 형인지 확인할 필요가 있습니다. |
| 6 | + |
| 7 | +객체가 직접 구현한 프로퍼티를 '가지고' 있는지를 확인하려면 (즉, 프로토타입네서 상속되지 않았는지 확인하려면) Object#hasOwnProperty를 사용할 수 있습니다. |
| 8 | + |
| 9 | +```js |
| 10 | +var duck = { |
| 11 | + quack: function() { |
| 12 | + console.log('quack') |
| 13 | + } |
| 14 | +} |
| 15 | + |
| 16 | +duck.hasOwnProperty('quack') // => true |
| 17 | +``` |
| 18 | + |
| 19 | +duck에 .hasOwnProperty 메소드를 구현한적이 없는데 어디서 왔을까요? |
| 20 | + |
| 21 | +duck은 `{}` 구문으로 만들어 쳤으므로 Object.prototype에서 상속됩니다. |
| 22 | + |
| 23 | +```js |
| 24 | +var object = {quack: true} |
| 25 | + |
| 26 | +Object.getPrototypeOf(object) === Object.prototype // => true |
| 27 | +object.hasOwnProperty('quack') // => true |
| 28 | +``` |
| 29 | + |
| 30 | +Object.prototype에서 상속되지 않은 객체라면 어떨까요? |
| 31 | + |
| 32 | +```js |
| 33 | +// 'null' 프로토타입으로 객체를 생성. |
| 34 | +var object = Object.create(null) |
| 35 | +object.quack = function() { |
| 36 | + console.log('quack') |
| 37 | +} |
| 38 | + |
| 39 | +Object.getPrototypeOf(object) === Object.prototype // => false |
| 40 | +Object.getPrototypeOf(object) === null // => true |
| 41 | + |
| 42 | +object.hasOwnProperty('quack') |
| 43 | +// => TypeError: Object object has no method 'hasOwnProperty' |
| 44 | +``` |
| 45 | + |
| 46 | +'객체처럼 보이는 것'에 `this` 값과 같이 호출할 수 있다면 `Object.prototype`를 통해 `hasOwnProperty`를 사용할 수 있습니다. Function#call을 사용하면 변경된 `this` 값으로 어떤 함수든 호출할 수 있습니다. |
| 47 | + |
| 48 | +```js |
| 49 | +// 호출할 때 넘기는 첫번째 인자는 `this`의 값이 됩니다 |
| 50 | +// 나머지 인자는 함수에 넘기는 인자가 됩니다 |
| 51 | + |
| 52 | +Object.prototype.hasOwnProperty.call(object, 'quack') // => true |
| 53 | +``` |
| 54 | + |
| 55 | +# 해야할 일: |
| 56 | + |
| 57 | +'quack' 프로퍼티가 직접 정의된 인자의 갯수를 반환하는 `duckCount` 함수를 작성하세요. 프로토타입에서 상속된 값은 재외하셔야 합니다. |
| 58 | + |
| 59 | +예제: |
| 60 | + |
| 61 | +```js |
| 62 | +var notDuck = Object.create({quack: true}) |
| 63 | +var duck = {quack: true} |
| 64 | +duckCount(duck, notDuck) // 1 |
| 65 | +``` |
| 66 | +## 인자 |
| 67 | + |
| 68 | +* 0-20개의 인자를 넘깁니다. 각 인자는 어떤 프로퍼티도 가질 수 있는 모든 형이 가능합니다. 몇몇 인자는 'quack' 프로퍼티를 가집니다. |
| 69 | + |
| 70 | +## 조건 |
| 71 | + |
| 72 | +* for/while 반복문이나 Array#forEach를 사용하지 마세요. |
| 73 | +* counter/accumulator 변수를 만들지 마세요. |
| 74 | +* 헬퍼같은 불필요한 함수를 만들지 마세요. |
| 75 | + |
| 76 | +## 힌트 |
| 77 | + |
| 78 | +* 모든 함수에서 사용할 수 있는 `arguments` 변수는 *배열*처럼 'quack'하는 *객체*입니다. |
| 79 | + |
| 80 | +```js |
| 81 | +{ |
| 82 | + 0: 'argument0', |
| 83 | + 1: 'argument1', // etc |
| 84 | + length: 2 |
| 85 | +} |
| 86 | +``` |
| 87 | + |
| 88 | +## 참고 |
| 89 | + |
| 90 | +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call |
| 91 | +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty |
| 92 | +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in |
| 93 | +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice#Array-like |
| 94 | +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments |
| 95 | + |
| 96 | + |
| 97 | +## 템플릿 |
| 98 | + |
| 99 | +```js |
| 100 | +function duckCount() { |
| 101 | + // 여기에 해답을 적으세요 |
| 102 | +} |
| 103 | + |
| 104 | +module.exports = duckCount |
| 105 | +``` |
0 commit comments