Hỏi về prototype trong nodejs



  • Theo như mình thấy thì : Bổ sung thuộc tính gender và phương thức showGender vào đối tượng Person như ví dụ sau:
    <php>// Tạo đối tượng
    function Person(){

    // Thuộc tính
    // ...
     
    // Phương thức
    // ...
    

    }

    // Bổ sung thông tin
    Person.prototype.gender = "";
    Person.prototype.showGender = function(){
    document.write(this.gender);
    };

    // Sử dụng
    var cuong = new Person();
    cuong.gender = "Nam";
    cuong.showGender();
    Vậy tại sao ko bổ sung luôn vào lúc khai báo mà lại dùng prototype làm gì vậy ạ, mọi người giải thích giúp mình với

    • list item</php>


  • @Duy-Nguyễn Mình chỉ muốn hỏi lại bạn là hướng đối tượng trong lập trình để làm gì.



  • Với ES5, javascript không có khái niểm class. Thay vào đó javascript prototype cho phép chúng ta implement OOP (Object Oriented Programing). Khi muốn định nghĩa một class (prototype based) như là parent class thì ta dùng prototype
    vdu:
    var Person = function(name) {
    this.name = name;
    this.canTalk = true;
    };

    Person.prototype.greet = function() {
    if (this.canTalk) {
    console.log('Hi, I am ' + this.name);
    }
    };

    var Employee = function(name, title) {
    Person.call(this, name);
    this.title = title;
    };

    Employee.prototype = Object.create(Person.prototype);
    Employee.prototype.constructor = Employee;

    Employee.prototype.greet = function() {
    if (this.canTalk) {
    console.log('Hi, I am ' + this.name + ', the ' + this.title);
    }
    };

    var Customer = function(name) {
    Person.call(this, name);
    };

    Customer.prototype = Object.create(Person.prototype);
    Customer.prototype.constructor = Customer;

    Customer, Employee kế thừa từ Person. những đối tượng được tạo ra từ Customer, Employee sẽ có các phương thức và thuộc tính của Person.

    Bạn có thể tham khảo thêm tại đây: https://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

    papa elf

    0


  • @Duy-Nguyễn về bản chất, thừa kế trong JS là thừa kế prototype. Nên định nghĩa trực tiếp trong prototype của đối tượng vẫn thuận theo tự nhiên hơn là this.x = y trong hàm dựng (constructor). Nhưng có điểm quan trọng hơn là: để dễ maintainance. Khi bạn định nghĩa methods trong prototype, thì việc thay đổi nó sẽ tác động lên toàn bộ các đối tượng thừa kế protype đó.

    Ví dụ cho dễ hiểu:

    • Khai báo showGender trong hàm dựng Person
      function Person() {
        this.gender = '';
        this.showGender = function () {
          console.log(this.gender);
        };
      }
    
      var cuong = new Person();
      cuong.gender = 'Male';
      cuong.showGender();
    
      // cập nhật prototype
      Person.prototype.showGender = () => {
        console.log('None');
      };
      cuong.showGender(); // vẫn là "Male" nhé
    
    • Khai báo showGender trên prototype của Person
      function Person() {
        this.gender = '';
      }
    
      Person.prototype.showGender = function () {
          console.log(this.gender);
      };
    
      var cuong = new Person();
      cuong.gender = 'Male';
      cuong.showGender();
    
      // cập nhật prototype
      Person.prototype.showGender = () => {
        console.log('None');
      };
      cuong.showGender(); // đây sẽ là "None" nhé
    

    Bạn có thể tạo ra nhiều instances của Person để kiểm tra ảnh hưởng từ nguyên mẫu.

    P/S: bạn nên kiểm tra kỹ bài post để tránh các lỗi hiển thị, cũng là tôn trọng người mà bạn hỏi.



  • @ndaidong Rất cảm ơn câu trả lời của bạn, mình mới sử dụng forum nên chưa thạo lắm mong các bạn thông cảm :D


Log in to reply