การเปรียบเทียบ 'สิ่งนี้' ใน JavaScript และ 'ตัวเอง' ใน Python

Dec 19 2022
ในการเขียนโปรแกรมเชิงวัตถุ ทั้ง this และ self ใช้เพื่ออ้างถึงอินสแตนซ์ปัจจุบันของออบเจกต์ที่กำลังเรียกใช้เมธอด วัตถุเป็นโครงสร้างข้อมูลที่ประกอบด้วยเขตข้อมูลและวิธีการ
ภาพโดย Di Bella Coffee

ในการเขียนโปรแกรมเชิงวัตถุthisและselfทั้งสองใช้เพื่ออ้างถึงอินสแตนซ์ปัจจุบันของวัตถุที่มีการเรียกใช้เมธอด

วัตถุเป็นโครงสร้างข้อมูลที่ประกอบด้วยเขตข้อมูลและวิธีการ ออบเจกต์แสดงถึงอินสแตนซ์เฉพาะของคลาส ซึ่งเป็นแม่แบบหรือพิมพ์เขียวสำหรับสร้างออบเจกต์

เมธอดคือฟังก์ชันที่เกี่ยวข้องกับวัตถุและใช้เพื่อดำเนินการบางอย่างหรือการคำนวณกับวัตถุ เมธอดถูกกำหนดไว้ในคำนิยามของคลาสและสามารถเรียกใช้บนออบเจกต์เพื่อทำงานเฉพาะได้

ใน JavaScript thisคำสำคัญหมายถึงวัตถุปัจจุบันที่กำลังเรียกใช้ฟังก์ชันปัจจุบัน เป็นวิธีการเข้าถึงคุณสมบัติและวิธีการของวัตถุจากภายในวัตถุเอง ค่าของthisถูกกำหนดโดยวิธีการเรียกใช้ฟังก์ชัน

นี่คือตัวอย่างวิธีการthisใช้งานใน JavaScript:

const person = {
  name: 'John',
  sayHi: function() {
    console.log(`Hi, my name is ${this.name}`);
  }
}

person.sayHi(); // Output: "Hi, my name is John"

ใน Python selfพารามิเตอร์ใช้เพื่ออ้างถึงอินสแตนซ์ของคลาส มันเทียบเท่ากับthisภาษาเชิงวัตถุอื่น ๆ พารามิเตอร์ใช้เพื่อเข้าถึง แอตทริบิวต์selfและเมธอดของคลาสจากภายในคลาสเอง

และนี่คือตัวอย่างวิธีการselfใช้งานใน Python:

class Person:
  def __init__(self, name):
    self.name = name
  
  def say_hi(self):
    print(f"Hi, my name is {self.name}")

person = Person("John")
person.say_hi() # Output: "Hi, my name is John"

จุดบกพร่องทั่วไปอย่างหนึ่งที่อาจเกิดขึ้นได้เมื่อใช้selfพารามิเตอร์ใน Python คือการลืมรวมพารามิเตอร์ตัวแรกในการกำหนดเมธอด ซึ่งอาจทำให้ a TypeErrorถูกยกขึ้นเมื่อเรียกใช้เมธอด เนื่องจากเมธอดคาดหวังว่าselfพารามิเตอร์จะถูกส่งผ่าน

นี่คือตัวอย่างของข้อผิดพลาดประเภทนี้:

class Person:
  def __init__(self, name):
    self.name = name
  
  def say_hi(): // missing self parameter
    print(f"Hi, my name is {self.name}") 

person = Person("John")
person.say_hi()

เพื่อแก้ไขจุดบกพร่องนี้ เราจำเป็นต้องรวมselfพารามิเตอร์ไว้ในการกำหนดเมธอดดังนี้:

def say_hi(self):
    print(f"Hi, my name is {self.name}")

การดีบัก JavaScript

จุดบกพร่องทั่วไปอย่างหนึ่งที่อาจเกิดขึ้นได้เมื่อใช้thisคำหลักใน JavaScript คือการใช้thisภายในฟังก์ชันที่ไม่ได้เชื่อมโยงกับวัตถุ ในกรณีนี้ ค่าของthisจะถูกตั้งค่าเป็นอ็อบเจกต์ส่วนกลาง ซึ่งอาจนำไปสู่ลักษณะการทำงานที่ไม่คาดคิดได้

นี่คือตัวอย่างของข้อผิดพลาดประเภทนี้:

const person = {
  name: 'John',
  sayHi: function() {
    console.log(`Hi, my name is ${this.name}`);
  }
}

const greet = person.sayHi;
greet(); // Output: "Hi, my name is undefined"

เมื่อเราเรียกใช้greetฟังก์ชัน ค่าthisภายในฟังก์ชันจะถูกตั้งค่าเป็น global object ซึ่งไม่มีnameคุณสมบัติ เป็นผลให้บันทึกการทักทายundefinedแทนค่าที่คาดไว้

ในการแก้ไขข้อบกพร่องนี้ เราสามารถผูกค่าของthisกับpersonวัตถุได้เมื่อสร้างgreetตัวแปร หรือเราสามารถใช้ฟังก์ชันลูกศรสำหรับsayHiเมธอดซึ่งไม่มีค่าของตัวเองthisและใช้thisค่าของบริบทโดยรอบ

นี่คือวิธีที่เราสามารถแก้ไขตัวอย่างโดยใช้bindวิธีการ:

const person = {
  name: 'John',
  sayHi: function() {
    console.log(`Hi, my name is ${this.name}`);
  }
}

const greet = person.sayHi.bind(person);
greet(); // Output: "Hi, my name is John"

const person = {
  name: 'John',
  sayHi: () => {
    console.log(`Hi, my name is ${this.name}`);
  }
}

const greet = person.sayHi;
greet(); // Output: "Hi, my name is John"

ใน JavaScript thisคำสำคัญใช้เพื่อเข้าถึงคุณสมบัติและวิธีการของวัตถุจากภายในวัตถุเอง การทำความเข้าใจวิธีกำหนดค่าของthisและวิธีการใช้อย่างถูกต้องเป็นสิ่งสำคัญสำหรับการทำงานกับออบเจกต์ใน JavaScript

ใน Python selfพารามิเตอร์ใช้เพื่ออ้างถึงอินสแตนซ์ของคลาสและเข้าถึงแอตทริบิวต์และวิธีการ การทำความเข้าใจวิธีใช้selfพารามิเตอร์อย่างถูกต้องเป็นสิ่งสำคัญสำหรับการทำงานกับคลาสและการเขียนโปรแกรมเชิงวัตถุใน Python

หากไม่มีความเข้าใจที่ถูกต้องเกี่ยวกับthisJavaScript และselfPython การเขียนโค้ดที่ถูกต้องและบำรุงรักษาได้ซึ่งใช้ออบเจกต์และคลาสเป็นเรื่องยาก

อ่านโพสต์อื่นของฉัน ' บางสิ่งเกี่ยวกับ JavaScript และ Python 'เพื่อดูความเหมือนและความแตกต่างเพิ่มเติมระหว่างภาษาโปรแกรมทั้งสอง

ขอขอบคุณที่อ่านและหวังว่าคุณจะพบว่าสิ่งนี้มีประโยชน์ ฉันเปิดรับคำติชมและหากคุณพบข้อผิดพลาด โปรดแจ้งให้เราทราบ