Javascript에서 클래스와 대상 관계를 처리하는 초보자 가이드
18438 단어 oopjavascriptwebdev
나에게 있어서 가장 큰 조정 중 하나는 백엔드와 분리되는 것이며, Ruby on Rails와 같은 것을 사용할 때 영원히 고려할 필요가 없는 방식으로 그 구조와 대상을 거울로 보여야 한다.그렇다면 내가 이 글을 쓰는 것은 주로 내 자신의 이익을 위해 그것을 내 뇌에 두드려 미래의 두통을 막으려고 하는 것인가...그럴지도 모르지만, 이것도 너희들이 처음으로 더욱 쉽게 할 수 있기를 바란다.
그럼 어디서부터 시작할까요?데이터베이스 모델이나 이전이 우리의 관련을 지도하지 않기 때문에 우리는 반드시 자신의 관련을 구축해야 한다.여느 때와 마찬가지로 마술은 우리 반에서 일어났다.
class Pizza {
}
구체적으로 함수 작성 방법은 다음과 같습니다.class Pizza {
constructor(pizza) {
this.name = pizza.name
this.toppings = pizza.toppings
this.deliciousness = pizza.deliciousness
}
}
어떻게 된 거야?나는 this
에 대해 너무 많은 토론을 하지 않을 것이다. 왜냐하면 나는 그 자체가 가능할 뿐만 아니라, 이미 완전한 게시물이라고 믿기 때문이다. 그러나 더 많은 것은 (... 이것?)here, 더 깊이 알고 싶다면.우리의 목적은 this
이 피자류의 새로운 실례가 될 것이라고 말하기만 하면 된다.우리가 구조 함수에서 하는 일은 클래스가 자신의 실례를 어떻게 구축하고 어떤 속성을 주는지 알려주는 것이다.만약 당신이 대상을 대상으로 하는 다른 언어를 사용한 적이 있다면, 이것은 매우 익숙해 보일 것이다.예를 들어 Ruby에서 initialize
방법은 기본적으로 동일하게 작동합니다.그럼
pizza
의 논점은 무엇입니까?pizza
은 우리가 호출하기로 결정한 백엔드에서 전송된 대상이다.예를 들어, pizza API에서 JSON 객체를 가져옵니다.객체가 다음과 같이 보일 수 있습니다.[
{
"id": 1,
"name": "Margherita",
"deliciousness": 9,
"toppings": ["Mozzarella", "Tomato", "Basil"]
},
{
"id": 2,
"name": "Hawaiian",
"deliciousness": 3,
"toppings": ["Ham", "Pineapple"]
}
...
따라서 이러한 객체 중 하나를 누비고 새로운 Pizza 인스턴스를 생성하고자 합니다.처음에는 직관적이지 않았다. (왜 우리는 완벽한 물체를 가지고 그것을 다른 똑같은 물체로 만들어야 합니까?)그게 우리 대상 관계야.여기까지 말하고 보충해 봅시다.우리의 예에서 우리는
Pizzas
은 Human
에 속하고 Human
은 많은 Pizzas
에 속한다고 말할 수 있다.이 예에서 API의 데이터베이스인 객체를 어디서 가져오든 관계식을 반영해야 하지만 이 경우 구조 함수에 다른 속성을 추가하여 프런트엔드에 표시할 수 있습니다.class Pizza {
constructor(pizza) {
this.name = pizza.name
this.toppings = pizza.toppings
this.deliciousness = pizza.deliciousness
this.human = pizza.human
}
}
class Human {
constructor(human) {
this.name = human.name
this.pizzas = human.pizzas
}
}
이 코드는 유효하다.우리 JSON 대상 중 데이터베이스에 어떤 사람이 어떤 피자를 가지고 있는지 표시하는 것이 있을 것이다. 우리는 피자 대상의 구조 함수 방법을 수시로 호출하여 새로운 종류의 실례인 {"name": "Margherita", "human": {"name": "Cole"}}
을 만들 수 있다.하지만 잠재적인 문제도 있다.나에게 있어서 가장 흔히 볼 수 있는 것은 클래스 함수다.내 코드에서 new Pizza(pizza)
을 명확하게 정의했을 때, 나는 좌우의 오류를 얻었다.이전과 같은 클래스이지만, 이번에는 새로운 실례를 만들고 함수를 추가합니다.
// add function to Human class
class Human {
constructor(human) {
this.name = human.name
this.pizzas = human.pizzas
}
haveASlice(){
console.log("Pizza is the best!")
}
}
// our pretend backend objects
let pizza = {
"name": "Margherita",
"deliciousness": 9,
"toppings": ["Mozzarella", "Tomato", "Basil"],
"human": {"name": "Cole"}
}
let human = {"name": "Cole"}
// instantiating new class objects
let newPizza = new Pizza(pizza)
let newHuman = new Human(human)
위대하다이 모든 것이 설정되어 있습니다. 현재 우리는 모든 종류의 새로운 실례가 생겼습니다. 우리는 인류 종류의 모든 실례에서 함수 TypeError: <myFunc> is not a function
을 호출할 수 있습니다.하면, 만약, 만약...newHuman.haveASlice()
// returns
Pizza is the best!
아주 좋아, 우리가 예상한 대로!우리 돌아갈까요?newPizza.human.haveASlice()
// returns
Uncaught TypeError: newPizza.human.haveASlice is not a function
어떻게 된 거야?haveASlice
은 newPizza.human
과 마찬가지로 인간이죠?사실 그것들은 똑같아 보인다.문제는 이들이 같은 속성을 가지고 있지만 newHuman
은 일반적인 구javascript 대상일 뿐이다. 그 중에서 as newPizza.human
은 Human 클래스의 실례로 이 클래스에 정의된 함수에 접근할 수 있다는 것이다.둘 사이의 차이를 알기 전에 최근의 한 항목에서 이것은 매우 큰 좌절의 근원이었다. 내 코드에서 나는 여전히 규칙적인 대상이 주위에 떠 있었다.이 해결 방안은 시종일관 실례를 만들고, 이 클래스의 구조 함수에서 그것들과 관계가 있는 다른 클래스와 연결하며, 실례를 만드는 순서에 주의하는 것이다.예를 들어, Human 인스턴스를 먼저 작성하면 다음과 같이 할 수 있습니다.
class Pizza {
static all = []
constructor(pizza) {
this.name = pizza.name
this.toppings = pizza.toppings
this.deliciousness = pizza.deliciousness
this.human = Human.all.find(human => human.name === pizza.human.name)
Pizza.all.push(this)
}
}
class Human {
static all = []
constructor(human) {
this.name = human.name
this.pizzas = human.pizzas.map(pizza => new Pizza(pizza))
}
}
나는 그곳에 새로운 것이 많을 수 있다는 것을 알고 있지만, 우리의 생각은 인류 구조 함수에서 피자 실례를 만들고, 우리가 피자 구조 함수로 돌아갈 때 기존의 인류 실례를 검색하는 것이다. 이런 종류의 관계는 항상 클래스 실례에 의해 유지된다.다음은 설명 버전입니다.class Pizza {
// initialize an array for all my instances to live
static all = []
constructor(pizza) {
this.name = pizza.name
this.toppings = pizza.toppings
this.deliciousness = pizza.deliciousness
// find an existing Human from the Human.all array below
this.human = Human.all.find(human => human.name === pizza.human.name)
// add 'this' (the new Pizza instance) to the Pizza.all array
Pizza.all.push(this)
}
}
class Human {
// initialize an array for all my instances to live
static all = []
constructor(human) {
this.name = human.name
// create new Pizza instances, collect them in an array
// and make that array of instances an attribute on the new Human instance
this.pizzas = human.pizzas.map(pizza => new Pizza(pizza))
}
}
나는 이것이 도움이 될 수 있기를 바란다.읽어주셔서 감사합니다. 피자를 계속 창작하세요!
Reference
이 문제에 관하여(Javascript에서 클래스와 대상 관계를 처리하는 초보자 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/coleflournoy/a-beginners-guide-to-dealing-with-classes-and-object-relationships-in-javascript-l74텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)