ដោយ​ថ្នាក់​ក៏​ជា​ដែនកំណត់​មួយ​ដែរ ដូចនេះ​សម្បត្តិ​នៅ​ក្នុង​ថ្នាក់​និមួយ​ៗ មិន​អាច​ត្រូវ​ច្រឡំ​ទៅ​នឹង​សម្បត្តិ​នៅ​ក្នុង​ថ្នាក់​ផ្សេង​ៗ​ទៀត​បាន​ឡើយ ទោះបី​ជា​វត្ថុនិង​ឬ​អថេរ​​ទាំងនោះ​មាន​ឈ្មោះ​ដូច​គ្នា​ក៏​ដោយ​។ ម៉្យាងទៀត អត្ថប្រយោជន៍​ជា​សារវន្ត​នៃ​ការបង្កើត​ថ្នាក់ គឺ​ដើម្បី​អាច​បង្កើត​វត្ថុ​​និង​ឬ​អថេរ​ខុស​ៗ​គ្នា ដែល​មាន​ឈ្មោះ​ដូច​គ្នា ព្រោះ​វត្ថុ​​និង​ឬ​អថេរ​មាន​ឈ្មោះ​ដូច​គ្នា​ តែស្ថិត​នៅ​ក្នុង​ថ្នាក់​ខុស​គ្នា គឺ​ជា​វត្ថុ​ខុស​គ្នា​។ ហើយ​បើ​យើង​មិន​បង្កើត​ថ្នាក់​ ដែលជា​កន្លែង​សម្រាប់​បង្កើត​វត្ថុ​​និង​ឬ​អថេរ​ផ្សេង​ៗ​ទៀត​នោះ​ទេ បញ្ហា​ឈ្មោះ​ជាន់​គ្នា​នឹង​កើត​មាន​ឡើង​។

 

នៅ​ក្នង​ករណី​មាន​ការបន្ត​ថ្នាក់​ ដែល​នៅ​ក្នុង​នោះ​មាន​សម្បត្តិ​មាន​ឈ្មោះ​ដូច​គ្នា​ នៅ​ពេល​ដែល​សម្បត្តិ​ទាំងនោះ​ត្រូវ​យក​មក​ប្រើ សម្បត្តិ​ដែល​ត្រូវ​រក​ឃើញ​មុន​គេ នឹង​ត្រូវ​យក​មក​ប្រើ​។ ពិនិត្យ​កម្មវិធី​ខាង​ក្រោម​នេះ៖

 

function ThreeD(){
  this.pi = 3.14;
}
 
//ការបង្កើត​វិធី​ឈ្មោះ getVolume សំរាប់​ថ្នាក់ ThreeD
ThreeD.prototype.getVolume = function(){
  console.log('មាឌ​វត្ថុ');
}
 
function Cube(){
  this.pi = 3.1415;
}
 
Cube.prototype = new ThreeD();
 
//ការបង្កើត​វិធី​ឈ្មោះ getVolume មួយ​ទៀត​សំរាប់​ថ្នាក់ Cube
Cube.prototype.getVolume = function(){
  console.log('មាឌ​របស់​គីប​');
} 
 
function Box(){
  this.pi = 3.141592;
}
 
Box.prototype = new Cube();
 
//ការបង្កើត​វិធី​ឈ្មោះ getVolume មួយ​ទៀត​សំរាប់​ថ្នាក់ Box
Box.prototype.getVolume = function(){
  console.log('មាឌរបស់​ប្រអប់');
}
 
boxInstance = new Box();
cubeInstance = new Cube();
 
console.log('pi គឺ​ជា​លេខ​៖ ' + boxInstance.pi);
console.log('pi គឺ​ជា​លេខ​៖ ' + cubeInstance.pi);
 
//ការយក​វិធី​ឈ្មោះ​ដូច​គ្នា​មក​ប្រើ​តាម​រយៈ​សិស្ស​ខុស​ៗ​គ្នា
boxInstance.getVolume();
cubeInstance.getVolume();

 

នៅ​លើ​បន្ទាត់​លេខ 35 ការសរសេរ​ថា boxInstance.pi គឺ​ជា​បញ្ជា​តម្រូវ​ឲ្យ​យក​ទិន្នន័យ​ឈ្មោះ pi មក​ប្រើ​ការ​ តាម​រយៈ​សិស្ស​ឈ្មោះ boxInstance ។ យោង​ទៅ​តាម​ក្បួន​ច្បាប់​នៅ​ក្នុង​ភាសា JavaScript ការស្វែង​រក​វត្ថុ​ឈ្មោះ​ pi​ នោះ​ត្រូវ​ធ្វើ​ឡើង​នៅ​ក្នុង​សិស្ស​ឈ្មោះ boxInstance​ នោះ​មុន​ រួច​បាន​ឡើង​ទៅ​ថ្នាក់​របស់​វា រួច​បាន​ទៅ​ថ្នាក់មេ​របស់​វា​។ ហើយ​គឺ​ជា​ទិន្នន័យ​​របស់​សិស្ស​ឈ្មោះ boxInstance នោះ ​ដែល​ត្រូវ​យក​មក​ប្រើការ ព្រោះ​វា​ត្រូវ​បាន​រក​ឃើញ​នៅ​ក្នុង​សិស្ស​នោះ​មុន​គេ​។

 

នៅ​លើ​បន្ទាត់​លេខ 36 ការសរសេរ​ថា cubeInstance.pi គឺ ​ជា​បញ្ជា​តម្រូវ​ឲ្យ​យក​ទិន្នន័យ​ឈ្មោះ pi មក​ប្រើ​ការ​ តាម​រយៈ​សិស្ស​ឈ្មោះ cubeInstance ។ យោង​ទៅ​តាម​ក្បួន​ច្បាប់​នៅ​ក្នុង​ភាសា JavaScript ការស្វែង​រក​វត្ថុ​ឈ្មោះ​ pi​ នោះ​ត្រូវ​ធ្វើ​ឡើង​នៅ​ក្នុង​សិស្ស​ឈ្មោះ cubeInstance នោះ​មុន​ រួច​បាន​ឡើង​ទៅ​ថ្នាក់​របស់​វា រួច​បាន​ទៅ​ថ្នាក់មេ​របស់​វា​។ ហើយ​គឺ​ជា​ទិន្នន័យ​​របស់​សិស្ស​ឈ្មោះ cubeInstance នោះ ​ដែល​ត្រូវ​យក​មក​ប្រើការ ព្រោះ​វា​ត្រូវ​បាន​រក​ឃើញ​នៅ​ក្នុង​សិស្ស​នោះ​មុន​គេ​។

 

នៅ​លើ​បន្ទាត់​លេខ 39 ការសរសេរ​ថា boxInstance.getVolume() គឺ ​ជា​បញ្ជា​តម្រូវ​ឲ្យ​យក​វិធី​​ឈ្មោះ getVolume មក​ប្រើ​ការ​ តាម​រយៈ​សិស្ស​ឈ្មោះ boxInstance ។ យោង​ទៅ​តាម​ក្បួន​ច្បាប់​នៅ​ក្នុង​ភាសា JavaScript ការស្វែង​រក​វិធី​ឈ្មោះ​ getVolume នោះ​ត្រូវ​ធ្វើ​ឡើង​នៅ​ក្នុង​សិស្ស​ឈ្មោះ boxInstance​ នោះ​មុន​ រួច​បាន​ឡើង​ទៅ​ថ្នាក់​របស់​វា រួច​បាន​ទៅ​ថ្នាក់មេ​របស់​វា​។ ហើយ​គឺ​ជា​​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់​ឈ្មោះ Box ​ដែល​ត្រូវ​យក​មក​ប្រើការ ព្រោះ​វា​ត្រូវ​បាន​រក​ឃើញ​នៅ​ក្នុង​ថ្នាក់​នោះ​មុន​គេ​។

 

នៅ​លើ​បន្ទាត់​លេខ 40 ការសរសេរ​ថា cubeInstance.getVolume() គឺ ​ជា​បញ្ជា​តម្រូវ​ឲ្យ​យក​វិធី​​ឈ្មោះ cubeInstance មក​ប្រើ​ការ​ តាម​រយៈ​សិស្ស​ឈ្មោះ cubeInstance ។ យោង​ទៅ​តាម​ក្បួន​ច្បាប់​នៅ​ក្នុង​ភាសា JavaScript ការស្វែង​រក​វិធី​ឈ្មោះ​ getVolume​ នោះ​ត្រូវ​ធ្វើ​ឡើង​នៅ​ក្នុង​សិស្ស​ឈ្មោះ cubeInstance នោះ​មុន​ រួច​បាន​ឡើង​ទៅ​ថ្នាក់​របស់​វា រួច​បាន​ទៅ​ថ្នាក់មេ​របស់​វា​។ ហើយ​គឺ​ជា​​វិធី​ឈ្មោះ getVolume​ ​នៅ​ក្នុង​ថ្នាក់​ឈ្មោះ Cube ​ដែល​ត្រូវ​យក​មក​ប្រើការ ព្រោះ​វា​ត្រូវ​បាន​រក​ឃើញ​នៅ​ក្នុង​ថ្នាក់​នោះ​មុន​គេ​។

 

នៅ​ពេល​ដែល​យើង​បង្កើត​វិធី​នៅ​ក្នុង​ថ្នាក់រង ដូច​គ្នា​ទៅ​​នឹង​វិធី​នៅ​ក្នុង​ថ្នាក់​មេ គេ​និយាយ​ថា​យើង​បង្កើត​វិធី​នៅ​ក្នុង​ថ្នាក់រង ​បាំង (override) វិធី​នៅ​ក្នុង​ថ្នាក់​មេ​។ ក្នុង​ករណី​នេះ វិធី​នៅ​ក្នុង​ថ្នាក់​រង​ត្រូវ​ហៅ​ថា វិធីបាំងគេ (overriding method) និង​​វិធី​នៅ​ក្នុង​ថ្នាក់​មេ ត្រូវ​ហៅ​ថា វិធីត្រូវគេបាំង (overridden method) ។

 

មួយវិញទៀត ក្នុងករណី​ដែល​ថ្នាក់មេ​ និង​ថ្នាក់រង​មាន​សម្បត្តិ​មាន​ឈ្មោះ​ដូច​គ្នា នៅ​ពេល​ដែល​យើង​យក​សម្បត្តិ​ណា​មួយ​ទៅ​ប្រើ សម្បត្តិ​ដែល​ត្រូវ​យក​ទៅ​ប្រើ គឺ​អាស្រ័យ​ទៅ​លើ​​សិស្ស​។ ជាក់ស្តែង​នៅ​ក្នុង​កម្មវិធី​ខាង​លើ ការយក​វិធី​ឈ្មោះ getVolume នៃ​ថ្នាក់​ណា​មួយ​ទៅ​ប្រើ គឺ​អាស្រ័យ​ទៅ​លើ​សិស្ស​ ដែល​តាមរយៈ​វា​ វិធី​នោះ​ត្រូវ​បាន​យក​ទៅ​ប្រើ​។ គឺថា​ បើ​សិស្ស​ជា​សិស្ស​នៃ​ថ្នាក់​ឈ្មោះ Box គឺជា​វិធី​ឈ្មោះ getVolume នៃ​ថ្នាក់​ឈ្មោះ​ Box ​នោះ​ ដែល​ត្រូវ​យក​ទៅ​ប្រើ​។ តែ​បើ​សិស្ស​ជា​សិស្ស​នៃ​ថ្នាក់​ឈ្មោះ Cube វិញ គឺ​ជា​វិធី​ឈ្មោះ getVolume នៃ​ថ្នាក់​ឈ្មោះ Cube ដែល​ត្រូវ​យក​ទៅ​ប្រើ​​។ នៅ​ក្នុង​ការសរសេរ​កម្មវិធី​កំព្យូទ័រ ភាពដែល​អាច​ប្រែក្រឡា​​បាន​នេះ ត្រូវ​ហៅថា លក្ខណៈប្រែរូប (polymorphism) ដែល​ជា​ចំណុច​ដ៏​សំខាន់​មួយ​នៅ​ក្នុង​ការសរសេរ​កម្មវិធី​ ដោយ​បង្កើត​ថ្នាក់​ផ្សេង​ៗ​ (OOP) ។

 

យើង​បាន​ដឹង​រួច​មក​ហើយ​ថា នៅ​ពេល​ដែលយើង​យក​វិធី​មាន​ឈ្មោះ​ដូច​គ្នា​មក​ប្រើ​តាម​រយៈ​សិស្ស​នៃ​ថ្នាក់​រង គឺ​ជា​វិធី​បាំង​គេ​នៅ​ក្នុង​ថ្នាក់​រង ដែល​ត្រូវ​យក​ទៅ​ប្រើ ព្រោះ​វា​ត្រូវ​បាន​រក​ឃើញ​នៅ​​ក្នុង​ថ្នាក់​នោះ​មុន​គេ​។ ក៏ប៉ុន្តែ បើ​សិន​ជា​យើង​ចង់​ឲ្យ​វិធី​ត្រូវ​គេ​បាំង​នៅ​ក្នុង​ថ្នាក់​មេ​ត្រូវ​យក​ទៅ​ប្រើ​ដែរ នៅ​ពេល​ដែល​វិធី​បាំង​គេ​នៅ​ក្នុង​ថ្នាក់​រង​ត្រូវ​យក​ទៅ​ប្រើ យើង​ត្រូវ​ធ្វើ​ដូច​ខាង​ក្រោម​នេះ​៖

 

function ThreeD(){
  this.pi = 3.14;
}
 
//ការបង្កើត​វិធី​ឈ្មោះ getVolume សំរាប់​ថ្នាក់ ThreeD
ThreeD.prototype.getVolume = function(){
  console.log('មាឌ​វត្ថុ');
}
 
function Cube(){
  this.pi = 3.1415;
}
 
Cube.prototype = new ThreeD();
 
//ការបង្កើត​វិធី​ឈ្មោះ getVolume មួយ​ទៀត​សំរាប់​ថ្នាក់ Cube
Cube.prototype.getVolume = function(){
  //ការយក​វិធី​ឈ្មោះ​ដូច​គ្នា​ក្នុង​ថ្នាក់​មេ​មក​ប្រើ
  ThreeD.prototype.getVolume.call(this);
 
  console.log('មាឌ​របស់​គីប​');
} 
 
function Box(){
  this.pi = 3.141592;
}
 
Box.prototype = new Cube();
 
//ការបង្កើត​វិធី​ឈ្មោះ getVolume មួយ​ទៀត​សំរាប់​ថ្នាក់ Box
Box.prototype.getVolume = function(){
  //ការយក​វិធី​ឈ្មោះ​ដូច​គ្នា​ក្នុង​ថ្នាក់​មេ​មក​ប្រើ
  Cube.prototype.getVolume.call(this);
 
  console.log('មាឌរបស់​ប្រអប់');
}
 
boxInstance = new Box();
 
//ការយក​វិធី​ឈ្មោះ​ដូច​គ្នា​តៗ​គ្នា​​មក​ប្រើ​
boxInstance.getVolume();

 

នៅលើ​បន្ទាត់​លេខ 19 ការសរសេរ​ថា ThreeD.prototype.getVolume.call(this) គឺ​ជា​បញ្ជា​តម្រូវ​ឲ្យ​យក​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់​មេ​ឈ្មោះ ThreeD មក​ប្រើ​នៅ​ក្នុង​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់រង​ឈ្មោះ Cube ។ ដូចនេះ​នៅ​ពេលដែល​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់​រង​ត្រូវ​យក​ទៅ​ប្រើ វិធី​ឈ្មោះ​ getVolume នៅ​ក្នុង​ថ្នាក់​មេ ក៏​ត្រូវ​យក​ទៅ​ប្រើ​ដែរ​។

 

នៅលើ​បន្ទាត់​លេខ 33 ការសរសេរ​ថា Cube.prototype.getVolume.call(this) គឺ​ជា​បញ្ជា​តម្រូវ​ឲ្យ​យក​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់​មេ​ឈ្មោះ Cube មក​ប្រើ​នៅ​ក្នុង​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់រង​ឈ្មោះ Box ។ ដូចនេះ​នៅ​ពេលដែល​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់​រង​ត្រូវ​យក​ទៅ​ប្រើ វិធី​ឈ្មោះ​ getVolume នៅ​ក្នុង​ថ្នាក់​មេ ក៏​ត្រូវ​យក​ទៅ​ប្រើ​ដែរ​។

 

ដូចនេះ​យើង​ឃើញ​ថា នៅ​ក្នុង​ការយក​វិធី​ត្រូវ​គេបាំង​នៅ​ក្នុង​ថ្នាក់មេ​ មក​ប្រើ​នៅ​ក្នុង​វិធី​បាំងគេ​នៅ​ក្នុង​ថ្នាក់រង ដំណឹង​ដែល​ជា​សិស្ស​ឈ្មោះ this មិន​ត្រូវ​បាន​ផ្តល់​​ជា​ដំណឹង​​ទី​មួយ ឲ្យ​ទៅ​វិធីនៅ​​ក្នុង​ថ្នាក់មេ​​ដោយ​ស្វ័យប្រវត្ថិ​ឡើយ​។ អាស្រ័យ​ហេតុនេះ យើង​ចាំបាច់​ត្រូវ​តែ​ផ្តល់​​​​វត្ថុ​ដែល​ជា​សិស្ស​ឈ្មោះ this នេះ ជា​ដំណឹង​ទីមួយ ដោយ​​ខ្លួនយើង​ផ្ទាល់ សម្រាប់​វិធី​ត្រូវ​គេ​បាំង​​​​​ ដែល​យើង​យក​មក​ប្រើ​​។

 

នៅ​លើ​បន្ទាត់លេខ 41 ការសរសេរថា boxInstance.getVolume() គឺ​ជាបញ្ជា​តម្រូវ​ឲ្យ​យក​​​វិធី​ឈ្មោះ getVolume ​នៅ​ក្នុង​ថ្នាក់​ឈ្មោះ​ Box មក​ប្រើ​។ ប្រការនេះ​បាន​​​ធ្វើ​ឲ្យ​វិធី​​ឈ្មោះ getVolume នៅ​ក្នុង​ថ្នាក់​មេ​ឈ្មោះ Cube ក៏​ត្រូវ​បាន​​យក​មក​​ប្រើ​ដែរ​។ ហើយ​នៅ​ពេល​ដែល​វិធី​ឈ្មោះ getVolume នៅ​ក្នុង​​ថ្នាក់​មេ​ឈ្មោះ​ Cube ត្រូវ​​បាន​យក​មក​​ប្រើ វិធី​ឈ្មោះ​ getVolume នៅ​ក្នុង​ថ្នាក់​មេ​ឈ្មោះ ThreeD ក៏​ត្រូវ​បាន​យក​​មក​ប្រើ​ដែរ​៕