2013. 1. 27. 23:22
Languages/CoffeeScript
Java 처럼 Class를 쉽게 만들어 보자. 클래스끼리 상속하여 재정의(overriding)하는 부분도 알아보자
1) Class 만들기
- class 로 표현한다
- 컴파일 내역에 IIFE(즉시실행함수)안에 다시 Dog을 생성하여 호출함
// clazz.coffee class Dog // 컴파일 내역 : clazz.js // Generated by CoffeeScript 1.4.0 (function() { var Dog; Dog = (function() { function Dog() {} return Dog; })(); }).call(this);
- constructor 로 생성자를 정의한다
- constructor를 사용하면 Dog 생성자가 생성되고 다른 프로퍼티는 prototype에 정의된다
// clazz2.coffee class Dog constructor: (@name) -> growl: -> console.log '*growl*' dog = new Dog 'Dowon' console.log dog.name dog.growl() // 결과 D:\Development\coffeescript\4>coffee clazz2 Dowon *growl* // 컴파일 내역 : clazz2.js // Generated by CoffeeScript 1.4.0 var Dog, dog; Dog = (function() { function Dog(name) { this.name = name; } Dog.prototype.growl = function() { return console.log('*growl*'); }; return Dog; })(); dog = new Dog('Dowon'); console.log(dog.name); dog.growl();
2) 상속 관계 만들기
- extends 사용하여 상속관계 정의 한다
- super() 사용하여 동일 메소드에 대한 재정의(Overriding)을 한다
// clazz3.coffee class Dog constructor: (@name) -> growl: -> console.log '*growl*' class BorderCollie extends Dog constructor: (name, @tricks = []) -> super name perform: (trick) -> console.log if trick in @tricks then "#{@name} is #{trick}" else '*whine*' growl: (person) -> if person is @master console.log '*bark*' else super() # Dog.growl() dog = new Dog 'Dowon' console.log dog.name dog.growl() dog2 = new BorderCollie 'YoungSik', ['playing', 'catching', 'rolling'] dog2.master = "Dowon" console.log dog2.name dog2.perform 'rolling' dog2.growl("Dowon") dog2.growl("Yun") // 결과 D:\Development\coffeescript\4>coffee clazz3 Dowon *growl* YoungSik YoungSik is rolling *bark* *growl*
- BorderCollie extends Dog 으로 상속 만들어 줌
- BorderCollie의 constructor안에 "super name" 을 호출하여 super(name)을 넣어 줌
- BorderCollie의 grow안에서 super() 를 호출하여 super.growl()을 넣어 줌
// 컴파일 내역 : clazz3.js // Generated by CoffeeScript 1.4.0 (function() { var BorderCollie, Dog, dog, dog2, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; Dog = (function() { function Dog(name) { this.name = name; } Dog.prototype.growl = function() { return console.log('*growl*'); }; return Dog; })(); BorderCollie = (function(_super) { __extends(BorderCollie, _super); function BorderCollie(name, tricks) { this.tricks = tricks != null ? tricks : []; BorderCollie.__super__.constructor.call(this, name); } BorderCollie.prototype.perform = function(trick) { return console.log(__indexOf.call(this.tricks, trick) >= 0 ? "" + this.name + " is " + trick : '*whine*'); }; BorderCollie.prototype.growl = function(person) { if (person === this.master) { return console.log('*bark*'); } else { return BorderCollie.__super__.growl.call(this); } }; return BorderCollie; })(Dog); dog = new Dog('Dowon'); console.log(dog.name); dog.growl(); dog2 = new BorderCollie('YoungSik', ['playing', 'catching', 'rolling']); dog2.master = "Dowon"; console.log(dog2.name); dog2.perform('rolling'); dog2.growl("Dowon"); dog2.growl("Yun"); }).call(this);
* 파일
'Languages > CoffeeScript' 카테고리의 다른 글
[CoffeeScript] 핵심 문법 정리하기 (1) (0) | 2013.01.31 |
---|---|
[CoffeeScript] 문법 사용하기 (5) - regex, html (0) | 2013.01.29 |
[CoffeeScript] 문법 사용하기 (3) - @ :: 표현 (0) | 2013.01.27 |
[CoffeeScript] 문법 사용하기 (2) - 조건, 반복문 (0) | 2013.01.24 |
[CoffeeScript] 문법 사용하기 (1) (0) | 2013.01.24 |