๐ค...
function Car(name, speed) {
this.name = name;
this.speed = speed;
}
Car.prototype.drive = function () {
console.log(`${this.name} runs at ${this.speed}`)
};
var morning = new Car('morning', 50);
morning.drive();
function Bike(name, speed, maxSpeed) {
Car.apply(this, arguments)
this.maxSpeed = maxSpeed;
}
Bike.prototype = Object.create(Car.prototype);
Bike.prototype.constructor = Bike;
Bike.prototype.boost = function () {
console.log(`${this.name} boosts its speed at ${this.maxSpeed}`)
}
var honda = new Bike('honda', 100, 200);
honda.drive();
honda.boost();
์ ์ฝ๋์ ํ์ด๋ ๋๋ต ์๋์ ๊ฐ๋ค.
Car.apply(this, arguments);
๋ Car์ this
๋ค์ ๊ทธ๋๋ก ๋ฐ์ผ๋ผ๋ ์๋ฏธ์ด๋ค. ์ฆ, Car ์์ฑ์์ this
์ arguments
๋ฅผ ์ ์ฉํ๋ผ๋ ๋ง์ด๋ค. arguments
๋ ๋งค๊ฐ๋ณ์๋ฅผ ์๋ฏธํ๋ค.
Bike.prototype = Object.create(Car.prototype)
์ Car์ ๋ฉ์๋์ธ drive๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Bike์ prototype๊ณผ Car์ prototype์ ์ฐ๊ฒฐํด์ค๋ค.
Object.create()
๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฉ์๋์ด๋ค. Object.create(Car.prototype)
๊ณผ new Car()
์ ์ฐจ์ด๋, Object.create
๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ์์ฑ์๋ ์คํํ์ง ์๋๋ค. ์ฆ ํ๋กํ ํ์
๋ง ๋ฃ๋๋ค.
Bike์ ๋น Car.prototype
์ด ๋ค์ด์๋ ๊ฐ์ฒด๋ฅผ ์ฃผ์๊ธฐ ๋๋ฌธ์ ์๋ ๊ฐ๊ณ ์๋ prototype๊ณผ constructor๊ฐ ์ญ์ ๋์๋ค. ๋ฐ๋ผ์ ๋ค์ constructor
๋ฅผ ์ง์ ํด์ฃผ๋ ์์
์ ํด ์ค์ผํ๋ค.
๋ ๋ค๋ฅธ ์์ ๋ ๋ง๋ค์ด๋ณผ๊น?
function Fruit () {
this.colorRed = function () {
console.log("RED")
}
}
function Apple (name) {
this.name = name;
this.colorRed = function () {
console.log("RED")
}
}
var apple = new Apple("apple");
Fruit
ํจ์์ Apple
ํจ์์ ์ค๋ณต๋๋ ์ฝ๋๊ฐ ์๋ค. ์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ณ ์ถ์ ๋ ์ด๋ป๊ฒ ํด์ผํ ๊น? ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฝ๋์ ์ํ์๋ฅผ ๊ตฌ๋ถ ํด์ผํ๋ค. Apple
๋ณด๋ค Fruit
๊ฐ ์์์ด๊ธฐ ๋๋ฌธ์ apple
์์ ์ค๋ณต๋๋ ํจ์๋ฅผ ์ง์์ค๋ค.
function Fruit () {
this.colorRed = function () {
console.log("RED")
}
}
function Apple (name) {
โ
Fruit.call(this);
this.name = name;
}
}
var apple = new Apple("apple");
Apple
ํจ์์์ Fruit
์ ์์ฑ์ ๊ฐ์ ธ ์ค๊ธฐ ์ํด call
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ค๋ค. call
๋ฉ์๋์ ์ธ์๋ก ๋ค์ด๊ฐ๋ this
๋ ๋ญ๊ฐ ๋ ๊น?
Fruit
ํจ์๊ฐ call
๋ฉ์๋๋ก ํธ์ถ๋์ด Fruit
ํจ์ ์์ this
๊ฐ Apple.call
์ ์ธ์ this
๊ฐ ๋๋ค. ์ด๋ ๊ฒ Fruit
์ Apple
์๊ฒ colorRed
๋ผ๋ ์์ฑ์ ์ฐ๊ฒฐ์์ผ์ฃผ์๋ค.
function Fruit () {
this.colorRed = function () {
console.log("RED")
}
}
โ
Fruit.prototype.sweet = function () {
console.log("SWEET")
}
function Apple (name) {
Fruit.call(this);
this.name = name;
}
}
var apple = new Apple("apple");
Fruit
์ sweet
๋ผ๋ ์์ฑ์ ์ถ๊ฐํ๋ค. Fruit
์ sweet
๋ ์ฐ๊ฒฐ์ด ๋์์ง๋ง Apple
์๋ sweet
๊ฐ ์๋ค. ์ฌ๊ธฐ์ Object.create()
๊ฐ ํ์ํ๊ฒ ๋๋ค.
Object.create()
์ง์ ๋ ํ๋กํ ํ์ ๊ฐ์ฒด ๋ฐ ์์ฑ์ ๊ฐ๋ ์๋ก์ด ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ค.
Object.create() ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋, ์์ฑ์ ํจ์๋ฅผ ์คํ์ํค์ง ์๋๋ค. ์ฆ, ๊ฐ์ฒด์ ํ๋กํ ํ์ ๋ง ๊ฐ์ ธ์จ๋ค.
function Fruit () {
this.colorRed = function () {
console.log("RED")
}
}
Fruit.prototype.sweet = function () {
console.log("SWEET")
}
function Apple (name) {
Fruit.call(this);
this.name = name;
}
}
โ
Apple.prototype = Object.create(Fruit.prototype);
var apple = new Apple("apple");
Object.create()
๋ฅผ ํตํด ๋ฐํ๋ ๋น ๊ฐ์ฒด์ prototype์ด Fruit.prototype
์ผ๋ก ์ค์ ๋์๋ค. ์ฌ๊ธฐ์ ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ๋ชจ๋ ํจ์์๋ prototype ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ Apple
๋ํ prototype์ด ์๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ Object.create()
๋ฅผ ์ฌ์ฉํด ๋น ๊ฐ์ฒด๋ก ์ฌํ ๋น ํด๋ฒ๋ ธ๋ค. prototype์๋ constructor ๋ผ๋ ์์ฑ์ด ์๊ณ ์ด ๋ํ ์ฌ๋ผ์ ธ๋ฒ๋ ธ๋ค. ๊ทธ๋์ constructor
๋ฅผ ๋ค์ ์ค์ ํด์ค์ผ ํ๋ค.
function Fruit () {
this.colorRed = function () {
console.log("RED")
}
}
Fruit.prototype.sweet = function () {
console.log("SWEET")
}
function Apple (name) {
Fruit.call(this);
this.name = name;
}
}
Apple.prototype = Object.create(Fruit.prototype);
โ
Apple.prototype.constructor = Apple;
var apple = new Apple("apple");
var food = new Fruit();
food.sweet();
apple.sweet();
์ฐธ์กฐ
MDN : Object.create()
Zerocho blog : ๊ฐ์ฒด ํ์ฅ
Poiemaweb : 5.2 ํ๋กํ ํ์
ํจํด ์์