ដោយថ្នាក់ក៏ជាដែនកំណត់មួយដែរ ដូចនេះសម្បត្តិនៅក្នុងថ្នាក់និមួយៗ មិនអាចត្រូវច្រឡំទៅនឹងសម្បត្តិនៅក្នុងថ្នាក់ផ្សេងៗទៀតបានឡើយ ទោះបីជាវត្ថុនិងឬអថេរទាំងនោះមានឈ្មោះដូចគ្នាក៏ដោយ។ ម៉្យាងទៀត អត្ថប្រយោជន៍ជាសារវន្តនៃការបង្កើតថ្នាក់ គឺដើម្បីអាចបង្កើតវត្ថុនិងឬអថេរខុសៗគ្នា ដែលមានឈ្មោះដូចគ្នា ព្រោះវត្ថុនិងឬអថេរមានឈ្មោះដូចគ្នា តែស្ថិតនៅក្នុងថ្នាក់ខុសគ្នា គឺជាវត្ថុខុសគ្នា។ ហើយបើយើងមិនបង្កើតថ្នាក់ ដែលជាកន្លែងសម្រាប់បង្កើតវត្ថុនិងឬអថេរផ្សេងៗទៀតនោះទេ បញ្ហាឈ្មោះជាន់គ្នានឹងកើតមានឡើង។
នៅក្នងករណីមានការបន្តថ្នាក់ ដែលនៅក្នុងនោះមានសម្បត្តិមានឈ្មោះដូចគ្នា នៅពេលដែលសម្បត្តិទាំងនោះត្រូវយកមកប្រើ សម្បត្តិដែលត្រូវរកឃើញមុនគេ នឹងត្រូវយកមកប្រើ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
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 ក៏ត្រូវបានយកមកប្រើដែរ៕