-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
클래스(class) #21
Comments
클래스(class)
클래스의 정의//ES5
var Person = (function() {
//생성자 함수 정의
function Person(name, job) {
this.name = name;
this.job = job;
}
Person.prototype.sayInfo = function() {
console.log('Name : ' + this.name + ', Job : ' + this.job);
}
return Person;
}());
var bkJang = new Person('BKJang', 'Developer');
bkJang.sayInfo(); //Name : BKJang, Job : Developer
//ES6
class Person {
constructor(name, job) {
this.name = name;
this.job = job;
}
sayInfo() {
console.log(`Name : ${this.name}, Job : ${this.job}`);
}
}
const bkJang = new Person('BKJang', 'Developer');
bkJang.sayInfo(); //Name : BKJang, Job : Developer 클래스는 기본적으로 위와 같이 둘의 또 다른 차이점은 생성자 함수를 이용하여 선언하면 또한 function Person() {}
class Developer {}
console.log(window.Person); //ƒ Person() {}
console.log(window.Developer); //undefined 인스턴스의 생성과 호이스팅
class Foo {
}
const foo = Foo(); //Uncaught TypeError: Class constructor Foo cannot be invoked without 'new'
const foo = new Foo(); //Uncaught ReferenceError: Foo is not defined
class Foo {
} constructor
class Foo {
}
const foo = new Foo();
console.log(Foo == Foo.prototype.constructor); //true 위의 코드에서 볼 수 있듯이 또 확인할 수 있는 것은 console.log(foo); //Foo {}
foo.name = 'BKJang';
console.log(foo); //Foo {name: "BKJang"}
class Foo {
name = ''; //Syntax Error
} class Bar {
constructor(name = '') {
this.name = name;
}
}
const bar = new Bar('BKJang');
console.log(bar); //Bar {name: "BKJang"}
getter, setter
class Person {
constructor(name) {
this.name = name;
}
//getter
get personName() {
return this.name ? this.name : null;
}
//setter
set personName(name) {
this.name = name;
}
}
const person = new Person('BKJang');
console.log(person.personName); //BKJang
person.personName = 'SHJo';
console.log(person.personName); //SHJo Static 메서드
또한 정적 메서드 내부에서는 class Person {
constructor(name) {
this.name = name;
}
//getter
get personName() {
return this.name ? this.name : null;
}
//setter
set personName(name) {
this.name = name;
}
static staticMethod() {
console.log(this);
return 'This is static';
}
}
console.log(Person.staticMethod());
/*
class Person { ... }
This is static
*/
const instance = new Person('BKJang');
console.log(instance.staticMethod()); //Uncaught TypeError: instance.staticMethod is not a function 위에서 볼 수 있듯이 인스턴스로는 또한 정적 메서드는 console.log(Person.staticMethod === Person.prototype.staticMethod); //false
console.log(new Person().personName === Person.prototype.personName); //true 클래스의 상속
class Person {
constructor(name, sex) {
this.name = name;
this.sex = sex;
}
getInfo() {
return `Name : ${this.name}, Sex : ${this.sex}`;
}
getName() {
return `Name : ${this.name}`;
}
getSex() {
return `Sex : ${this.sex}`;
}
}
class Developer extends Person { //extends를 사용하여 Person 클래스 상속
constructor(name, sex, job) {
//super메서드를 사용하여 부모 클래스의 인스턴스를 생성
super(name, sex);
this.job = job;
}
//오버라이딩
getInfo() {
//super 키워드를 사용하여 부모 클래스에 대한 참조
return `${super.getInfo()} , Job: ${this.job}`;
}
getJob() {
return `Job : ${this.job}`;
}
}
const person = new Person('SHJo', 'Male');
const developer = new Developer('BKJang', 'Male', 'Developer');
console.log(person); //Person {name: "SHJo", sex: "Male"}
console.log(developer); //Developer {name: "BKJang", sex: "Male", job: "Developer"}
console.log(person.getInfo()); //Name : SHJo, Sex : Male
console.log(developer.getName()); //Name : BKJang
console.log(developer.getSex()); //Sex : Male
console.log(developer.getJob()); //Job : Developer
console.log(developer.getInfo()); //Name : BKJang, Sex : Male , Job: Developer
console.log(developer instanceof Developer); //true
console.log(developer instanceof Person); //true 위의 소스를 기준으로 중요한 특징을 정리하자면 다음과 같다.(대부분의 객체 지향 언어에서 상속의 특징과 거의 동일하다.)
|
🙏 Reference
The text was updated successfully, but these errors were encountered: