10.2 Custom errors, extending Error필요에 따라 에러 객체를 커스텀해서 만들 수도 있다. (나도 Java에서는 만들어서 많이 사용을 했다.) 다만, Error 타입 객체를 무조건 상속할 필요는 없다는 점이 차이인데, 그래도 Error 타입 객체를 상속하는 것을 권장한다.Extending Error어떤 에러가 존재할 때, 해당 에러에 대한 validation 역할을 해줄 객체가 필요할 것이다. 그렇기 때문에 에러 객체를 커스텀하는 것이 필요하고 그에 맞게 에러를 던질 수 있겠다.class ValidationError extends Error { constructor(message) { super(message); this.name = "ValidationError";..
10.1 Erro handling, "try...catch"try...catch 구문은 자바와 거의 동일하다. catch문에 예외 타입을 명시하지 않는 것 정도?가 차이이겠다. 'parse-time 에러'가 발생할 경우 즉, 코드 구문 분석 과정에서 발생하는 에러는 try...catch가 동작하지 않는다. 오직 runtime error에만 동작한다. 또한, 동기적으로 동작하기 때문에 setTimeout과 같이 try...catch를 지나간 후에 발생하는 에러는 잡지 못한다. parse-time 에러는 Java에서의 compile error와 비슷하게 코드 실행 전에 발생하는 에러이다. 디테일한 차이가 분명히 있긴 하지만 현재로서는 요정도로 생각해도 좋을 것 같다.Error objectjavascript는..
8.4 Prototype methods, objects without __proto__사실 __proto__를 직접 사용하는 것은 별로 추천하지 않는다. 대신 아래 메서드를 사용하여 프로토타입을 사용할 수 있다. Object.create(proto, [descriptors]) – [[Prototype]]이 proto를 참조하는 빈 객체를 만듬. 프로퍼티 설명자를 추가로 넘길 수 있음Object.getPrototypeOf(obj) – obj의 [[Prototype]]을 반환.Object.setPrototypeOf(obj, proto) – obj의 [[Prototype]]이 proto가 되도록 설정.사용 예시let animal = { eats: true};// 프로토타입이 animal인 새로운 객체를 생성..
8.2 F.prototype이제껏 객체 내부에 직접 '__proto__'에 접근하여 prototype 상속을 적용했다면, 생성자 함수를 수행하는 시점에 바로 적용되도록 할 수도 있다. F.prototype 형식으로 해당 속성에 바로 접근하면 된다. 이는 '__proto__'랑은 분명히 다르다는 것에 주의하자. 아마 이 방법이 주로 쓰이는 것 같다.let animal = { eats: true};function Rabbit(name) { this.name = name;}Rabbit.prototype = animal;let rabbit = new Rabbit("흰 토끼"); // rabbit.__proto__ == animalalert( rabbit.eats ); // trueF.prototype은 n..
8.1 Prototypal inheritancejavascript에는 프로토타입 상속이라는 기능이 있다. Java에서의 상속과 비슷해 보이는 개념인데, 조금 다른 듯하다.[[Prototype]]사실 javascript에는 [[Prototype]]이라는 속성이 숨겨져 있다. 해당 속성은 null이거나 다른 객체를 참조하는데, 다른 객체를 참조할 경우 해당 객체를 프로토타입이라 부른다. object라는 객체가 있다고 가정했을 때, 해당 객체의 어느 속성을 읽으려고 하는데 해당 속성이 없다면 자동으로 프로토타입해서 해당 속성을 찾는다. 이러한 동작 방식을 '프로토타입 상속'이라 한다. 기본적으로 숨겨져있는 속성이지만, 개발자가 설정할 수 있는 방법들이 있다. '__proto__'를 통해 접근한다.let a..
9.6 Class checking: "instanceof"the instanceof operatorinstanceof 연산자는 obj가 Class에 속하거나 Class를 상속받는 클래스에 속하면 true를 반환한다. (자바와 기능이 같다.)class Rabbit {}let rabbit = new Rabbit();// rabbit이 클래스 Rabbit의 객체인가요?alert( rabbit instanceof Rabbit ); // true생성자 함수나 내장 클래스에도 사용 가능하다.// 클래스가 아닌 생성자 함수function Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true// ---------------let arr = [1, 2, 3];aler..
9.5 Extending built-in classes내장 클래스도 상속이 가능하다.// 메서드 하나를 추가합니다(더 많이 추가하는 것도 가능).class PowerArray extends Array { isEmpty() { return this.length === 0; }}let arr = new PowerArray(1, 2, 5, 10, 50);alert(arr.isEmpty()); // falselet filteredArr = arr.filter(item => item >= 10);alert(filteredArr); // 10, 50alert(filteredArr.isEmpty()); // false위 예시에서 arr.filter()가 상속받는 클래스인 PowerArray를 반환한다. 그렇..
9.3 Static properties and methodsprototype이 아닌 클래스 자체적으로 메서드를 설정할 수 있다?(아마도 프로토 타입은 인스턴스가 생성될 때만 동작하는 것 같다.)static 키워드를 붙여 만들 수 있고, 이를 정적 메서드라고 부른다. 어떤 객체가 아닌 클래스 전체에 활용될 수 있는 함수를 구현하고자 할 때 쓰인다.아래 Article 간의 비교를 위한 메서드가 그 예시다.class Article { constructor(title, date) { this.title = title; this.date = date; } static compare(articleA, articleB) { return articleA.date - articleB.date; }..