반응형
1. 인스턴스 메소드를 호출하면 메소드 내의 this 키워드는 메소드가 속한 객체를 가르킨다.
2. 클래스 메소드는 생성자 함수를 통해 호출되기 때문에this 키워드는 특정한 인스턴스를 참조하지 않는다.
대신 생성자 함수 자체를 참조한다. (일반적으로 클래스 메소드에서는 this를 사용하지 않는다)
3. 모든 함수에는 prototype 이라는 프로퍼티가 있는데, 이것은 함수가 정의될 때 부터 자동적으로 생성된다.
prototype 프로퍼티의 초기값은 constructor 프로퍼티 하나만 가지는 객체가 지정된다.
function Rectangle(w, h) {
this.width = w;
this.height = h;
// new Rectangle(...) 객체가 생성될 때 마다 메소드도 생성된다. 메모리 낭비다.
this.area = function() { return this.width * this.height; }
}
// new Rectangle(...)로 생성되는 모든 객체는 area() 메소드를 공유한다. (prototype의 특징)
Rectangle.prototype.area = function() { return this.width * this.height; }
4. 클래스 프로퍼티와 메소드는 모두 생성자 함수에 저장한다. (함수도 객체이기 때문에 가능하다)
// 생성자 함수를 정의한다.
function Circle(radius) {
this.r = radius; // 인스턴스 프로퍼티를 초기화한다.
}
// PI는 클래스 프로퍼티로 지정된다. 또한 생성자 함수의 프로퍼티가 된다.
Circle.PI = 3.14;
// prototype 메소드를 추가하여 모든 인스턴스가 해당 메소드를 공유하여 사용하게 한다.
Circle.prototype.area = function() { return Circle.PI * this.r * this.r; }
// max 는 클래스 메소드이다.
Circle.max = function(a, b) {
if ( a.r > b.r ) return a;
else return b;
}
// 사용법
var c = new Circle(1.0);
var a = c. area();
var d = new Circle(1.2);
var bigger = Circle.max(c, d);
5. private 프로퍼티 구현
function ImmutableRectangle(w, h) {
this.getWidth = function() { return w; }
this.getHeight = function() { return h; }
}
ImmutableRectangle.prototype.area = function() {
return this.getWidth() * this.getHeight();
}
6. 클래스 상속(1)
function Rectangle(w, h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function() { return this.width * this.height; }
Rectangle.prototype.toString = function() {
return "[" + this.width + "," + this.height + "]";
}
function PositionedRectangle(x, y, w, h) {
Rectangle.call(this, w, h);
this.x = x;
this.y = y;
}
PositionedRectangle.prototype = new Rectangle();
delete PositionedRectangle.prototype.width;
delete PositionedRectangle.prototype.height;
PositionedRectangle.prototype.constructor = PositionedRectangle;
PositionedRectangle.prototype.contains = function(x, y) {
return (x > this.x && x < this.y + this.width && y > this.y && y < this.y + this.height);
}
PositionedRectangle.prototype.toString = function() {
return "(" + this.x + "," + this.y + ") " +
Rectangle.prototype.toString.apply(this);
}
7. 클래스 상속(2)
- 6번의 방법에서 생성자 부분만 바꿔주고 재정의 부분도 superclass를 사용한다.
PositionedRectangle.prototype.superclass = Rectangle;
function PositionedRectangle(x, y, w, h) {
this.superclass(w, h);
this.x = x;
this.y = y;
}
PositionedRectangle.prototype.toString = function() {
return "(" + this.x + "," + this.y + ") " +
this.superclass.prototype.toString.apply(this);
}
8. 클래스 메소드 확장
function borrowMethods(borrowFrom, addTo) {
var from = borrowFrom.prototype;
var to = addTo.prototype;
for (m in from) {
if (typeof from[m] != "function") continue;
to[m] = from[m];
}
}
9. 객체 타입 판단
- typeof undefined : "undefined"
- typeof null : "object"
- typeof f : "function" f 가 함수라면
- typeof o : "object" o 가 객체이거나 null 이라면
- x instanceof Array : x가 Array 객체라면 true
- x instanceof Function : x 가 함수라면 true
- x instanceof Object : x가 객체(Array, RegExp, Date, Error 포함)이거나 함수라면 true
2. 클래스 메소드는 생성자 함수를 통해 호출되기 때문에this 키워드는 특정한 인스턴스를 참조하지 않는다.
대신 생성자 함수 자체를 참조한다. (일반적으로 클래스 메소드에서는 this를 사용하지 않는다)
3. 모든 함수에는 prototype 이라는 프로퍼티가 있는데, 이것은 함수가 정의될 때 부터 자동적으로 생성된다.
prototype 프로퍼티의 초기값은 constructor 프로퍼티 하나만 가지는 객체가 지정된다.
function Rectangle(w, h) {
this.width = w;
this.height = h;
// new Rectangle(...) 객체가 생성될 때 마다 메소드도 생성된다. 메모리 낭비다.
this.area = function() { return this.width * this.height; }
}
// new Rectangle(...)로 생성되는 모든 객체는 area() 메소드를 공유한다. (prototype의 특징)
Rectangle.prototype.area = function() { return this.width * this.height; }
4. 클래스 프로퍼티와 메소드는 모두 생성자 함수에 저장한다. (함수도 객체이기 때문에 가능하다)
// 생성자 함수를 정의한다.
function Circle(radius) {
this.r = radius; // 인스턴스 프로퍼티를 초기화한다.
}
// PI는 클래스 프로퍼티로 지정된다. 또한 생성자 함수의 프로퍼티가 된다.
Circle.PI = 3.14;
// prototype 메소드를 추가하여 모든 인스턴스가 해당 메소드를 공유하여 사용하게 한다.
Circle.prototype.area = function() { return Circle.PI * this.r * this.r; }
// max 는 클래스 메소드이다.
Circle.max = function(a, b) {
if ( a.r > b.r ) return a;
else return b;
}
// 사용법
var c = new Circle(1.0);
var a = c. area();
var d = new Circle(1.2);
var bigger = Circle.max(c, d);
5. private 프로퍼티 구현
function ImmutableRectangle(w, h) {
this.getWidth = function() { return w; }
this.getHeight = function() { return h; }
}
ImmutableRectangle.prototype.area = function() {
return this.getWidth() * this.getHeight();
}
6. 클래스 상속(1)
function Rectangle(w, h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function() { return this.width * this.height; }
Rectangle.prototype.toString = function() {
return "[" + this.width + "," + this.height + "]";
}
function PositionedRectangle(x, y, w, h) {
Rectangle.call(this, w, h);
this.x = x;
this.y = y;
}
PositionedRectangle.prototype = new Rectangle();
delete PositionedRectangle.prototype.width;
delete PositionedRectangle.prototype.height;
PositionedRectangle.prototype.constructor = PositionedRectangle;
PositionedRectangle.prototype.contains = function(x, y) {
return (x > this.x && x < this.y + this.width && y > this.y && y < this.y + this.height);
}
PositionedRectangle.prototype.toString = function() {
return "(" + this.x + "," + this.y + ") " +
Rectangle.prototype.toString.apply(this);
}
7. 클래스 상속(2)
- 6번의 방법에서 생성자 부분만 바꿔주고 재정의 부분도 superclass를 사용한다.
PositionedRectangle.prototype.superclass = Rectangle;
function PositionedRectangle(x, y, w, h) {
this.superclass(w, h);
this.x = x;
this.y = y;
}
PositionedRectangle.prototype.toString = function() {
return "(" + this.x + "," + this.y + ") " +
this.superclass.prototype.toString.apply(this);
}
8. 클래스 메소드 확장
function borrowMethods(borrowFrom, addTo) {
var from = borrowFrom.prototype;
var to = addTo.prototype;
for (m in from) {
if (typeof from[m] != "function") continue;
to[m] = from[m];
}
}
9. 객체 타입 판단
- typeof undefined : "undefined"
- typeof null : "object"
- typeof f : "function" f 가 함수라면
- typeof o : "object" o 가 객체이거나 null 이라면
- x instanceof Array : x가 Array 객체라면 true
- x instanceof Function : x 가 함수라면 true
- x instanceof Object : x가 객체(Array, RegExp, Date, Error 포함)이거나 함수라면 true
반응형