ការបន្តថ្នាក់ (inheritance) គឺជាការបង្កើតថ្នាក់មួយបន្តភ្ជាប់ទៅនឹងថ្នាក់ផ្សេងៗទៀត។ ដើម្បីបង្កើតថ្នាក់មួយបន្តភ្ជាប់ទៅនឹងថ្នាក់ផ្សេងៗទៀត យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
//ការបង្កើតថ្នាក់ឈ្មោះ ThreeD
function ThreeD(){
this.pi = 3.14;
}
ThreeD.prototype.getObjectVolume = function(){
console.log('មាឌ');
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Cube
function Cube(width, height, depth){
this.width = width;
this.height = height;
this.depth = depth;
}
//ការយកថ្នាក់ Cube ទៅបន្តភ្ជាប់នឹងថ្នាក់ ThreeD
Cube.prototype = new ThreeD();
Cube.prototype.getCubeVolume = function(){
this.volume = this.width * this.height * this.depth;
console.log('មាឌរបស់គីបគឺ៖ '+this.volume);
}
នៅលើបន្ទាត់លេខ 18 ការសរសរថា Cube.prototype = new ThreeD() គឺជាបញ្ជាតម្រូវឲ្យយកថ្នាក់ឈ្មោះ Cube មកបន្តភ្ជាប់ទៅនឹងថ្នាក់ឈ្មោះ ThreeD ។ ក្នុងករណីនេះ ថ្នាក់ឈ្មោះ ThreeD ត្រូវហៅថា ថ្នាក់មេ (superclass) ចំណែកឯថ្នាក់ឈ្មោះ Cube ត្រូវហៅថា ថ្នាក់រង (subclass) ។
ផលប្រយោជន៍នៃការបន្តថ្នាក់គឺថា តាមរយៈសិស្សនៃថ្នាក់រង យើងអាចយកសម្បត្តិទាំងអស់ ដែលមាននៅក្នុងថ្នាក់រងនិងថ្នាក់មេ មកប្រើប្រាស់បានតាមសេចក្តីត្រូវការ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
//ការបង្កើតថ្នាក់ឈ្មោះ ThreeD
function ThreeD(){
this.pi = 3.14;
}
ThreeD.prototype.getObjectVolume = function(){
console.log('មាឌ');
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Cube
function Cube(width, height, depth){
this.width = width;
this.height = height;
this.depth = depth;
}
//ការយកថ្នាក់ Cube ទៅបន្តភ្ជាប់នឹងថ្នាក់ ThreeD
Cube.prototype = new ThreeD();
Cube.prototype.getCubeVolume = function(){
this.volume = this.width * this.height * this.depth;
console.log('មាឌរបស់គីបគឺ៖ '+this.volume);
}
var cubeInstance = new Cube(25, 10, 5);
//ការយកទិន្នន័យថ្នាក់មេមកប្រើ
console.log('តម្លៃលេខរបស់ pi៖ '+cubeInstance.pi);
cubeInstance.getCubeVolume();
//ការយកវិធីក្នុងថ្នាក់មេមកប្រើ
cubeInstance.getObjectVolume();
នៅលើបន្ទាត់លេខ 28 ការសរសេរថា cubeInstance.pi គឺជាបញ្ជាតម្រូវឲ្យយកសម្បត្តិឈ្មោះ pi មកប្រើការ។ យោងទៅតាមក្បួនច្បាប់នៅក្នុងភាសា JavaScript ការស្វែងរកសម្បត្តិឈ្មោះ pi នេះ គឺត្រូវធ្វើឡើងនៅក្នុងសិស្សឈ្មោះ cubeInstance នោះមុនសិន រួចបានឡើងទៅថ្នាក់របស់វា រួចបានឡើងទៅថ្នាក់មេរបស់វាជាក្រោយ។ សម្បត្តិឈ្មោះ pi ត្រូវបានរកឃើញនៅក្នុងថ្នាក់មេឈ្មោះ ThreeD ព្រោះវាត្រូវបានបង្កើតឡើងនៅទីនោះ។
នៅលើបន្ទាត់លេខ 30 ការសរសេរថា cubeInstance.getCubeVolume() គឺជាបញ្ជាតម្រូវឲ្យយកវិធីឈ្មោះ getCubeVolume មកប្រើតាមរយៈសិស្សឈ្មោះ cubeInstance ដែលជាសិស្សនៃថ្នាក់រងឈ្មោះ Cube ។ ការស្វែងរកវិធីនោះគឺត្រូវធ្វើឡើងនៅក្នុងសិស្សនោះសិន រួចបានឡើងទៅថ្នាក់របស់វា រួចបានឡើងទៅថ្នាក់មេរបស់វា។ វិធីឈ្មោះ getCubeVolume ត្រូវបានរកឃើញនៅក្នុងថ្នាក់រងឈ្មោះ Cube ។
នៅលើបន្ទាត់លេខ 33 ការសរសេរថា cubeInstance.getObjectVolume() គឺជាបញ្ជាតម្រូវឲ្យយកវិធីឈ្មោះ getObjectVolume មកប្រើតាមរយៈសិស្សឈ្មោះ cubeInstance ដែលជាសិស្សនៃថ្នាក់រងឈ្មោះ Cube ។ ការស្វែងរកវិធីនោះគឺត្រូវធ្វើឡើងនៅក្នុងសិស្សនោះសិន រួចបានឡើងទៅថ្នាក់របស់វា រួចបានឡើងទៅថ្នាក់មេរបស់វា។ វិធីឈ្មោះ getObjectVolume ត្រូវបានរកឃើញនៅក្នុងថ្នាក់មេឈ្មោះ ThreeD ។
សរុបមក នៅពេលដែលសម្បត្តិណាមួយ ត្រូវបានយកមកប្រើតាមរយៈសិស្សណាមួយ ការស្វែងរកវត្ថុនិងឬអថេរនោះត្រូវធ្វើឡើងនៅក្នុងសិស្សនោះមុន រួចបានឡើងទៅថ្នាក់របស់សិស្សនោះ រួចបានទៅថ្នាក់មេរបស់នោះ បើសិនជាមាន។
នៅក្នុងការបន្តថ្នាក់ យើងអាចយកថ្នាក់មកបន្តគ្មា មានចំនួនប៉ុន្មានក៏បានដែរ។ ពោលគឺយើងអាចបង្កើតថ្នាក់មួយដោយបន្តភ្ជាប់ទៅនឹងមួយទៀត ដែលត្រូវបានបន្តភ្ជាប់ទៅនឹងថ្នាក់មួយទៀត ដែលត្រូវបានបន្តភ្ជាប់ទៅនឹងថ្នាក់មួយទៀត…
ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
//ការបង្កើតថ្នាក់ឈ្មោះ ThreeD
function ThreeD(){
this.pi = 3.14;
}
ThreeD.prototype.getObjectVolume = function(){
console.log('មាឌ');
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Cube
function Cube(width, height, depth){
this.width = width || 0;
this.height = height || 0;
this.depth = depth || 0;
}
//ការយកថ្នាក់ Cube ទៅបន្តភ្ជាប់នឹងថ្នាក់ ThreeD
Cube.prototype = new ThreeD();
Cube.prototype.getCubeVolume = function(){
this.volume = this.width * this.height * this.depth;
console.log('មាឌរបស់គីបគឺ៖ '+this.volume);
}
function Box(width, height, depth){
this.width = width || 0;
this.height = height || 0;
this.depth = depth || 0;
}
//ការយកថ្នាក់ Box ទៅបន្តភ្ជាប់នឹងថ្នាក់ Cube
Box.prototype = new Cube();
Box.prototype. getBoxVolume = function(){
this.volume = this.width * this.height * this.depth;
console.log('មាឌរបស់ប្រអប់គឺ៖ '+this.volume);
}
នៅលើបន្ទាត់លេខ 18 ការសរសរថា Cube.prototype = new ThreeD(); គឺជាបញ្ជាតម្រូវឲ្យយកថ្នាក់ឈ្មោះ Cube មកបន្តភ្ជាប់ទៅនឹងថ្នាក់ឈ្មោះ ThreeD ។
នៅលើបន្ទាត់លេខ 32 ការសរសេរថា Box.prototype = new Cube(); គឺជាបញ្ជាតម្រូវឲ្យយកថ្នាក់ឈ្មោះ Box មកបន្តភ្ជាប់ទៅនឹងថ្នាក់ឈ្មោះ Cube ដែលត្រូវបានបន្តភ្ជាប់ទៅនឹងថ្នាក់ឈ្មោះ ThreeD ។
ក្នុងករណីមានថ្នាក់ជាច្រើនតភ្ជាប់គ្នាពីមួយទៅមួយ នៅពេលដែលសម្បត្តិណាមួយត្រូវបានយកមកប្រើតាមរយៈសិស្សនៃថ្នាក់ណាមួយ ការស្វែងរកសម្បត្តិនោះ ត្រូវធ្វើឡើងជាដំបូងនៅក្នុងសិស្សនោះជាមុនសិន រួចបានឡើងទៅថ្នាក់របស់សិស្សនោះ រួចបានឡើងទៅថ្នាក់មេរបស់សិស្សនោះជាបន្តបន្ទាប់រហូតសម្បត្តិត្រូវបានរកឃើញ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
//ការបង្កើតថ្នាក់ឈ្មោះ ThreeD
function ThreeD(){
this.pi = 3.14;
}
ThreeD.prototype.getObjectVolume = function(){
console.log('មាឌ');
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Cube
function Cube(width, height, depth){
this.width = width || 0;
this.height = height || 0;
this.depth = depth || 0;
}
//ការយកថ្នាក់ Cube ទៅបន្តភ្ជាប់នឹងថ្នាក់ ThreeD
Cube.prototype = new ThreeD();
Cube.prototype.getCubeVolume = function(){
this.volume = this.width * this.height * this.depth;
console.log('មាឌរបស់គីបគឺ៖ '+this.volume);
}
function Box(width, height, depth){
this.width = width || 0;
this.height = height || 0;
this.depth = depth || 0;
}
//ការយកថ្នាក់ Box ទៅបន្តភ្ជាប់នឹងថ្នាក់ Cube
Box.prototype = new Cube();
Box.prototype. getBoxVolume = function(){
this.volume = this.width * this.height * this.depth;
console.log('មាឌរបស់ប្រអប់គឺ៖ '+this.volume);
}
var boxInstance = new Box(25, 10, 5);
boxInstance.getBoxVolume();
boxInstance.getCubeVolume();
console.log('pi គឺជាលេខ៖ '+boxInstance.pi);
នៅលើបន្ទាត់លេខ 40 ការសរសេរថា boxInstance.getBoxVolume() គឺជាបញ្ជាតម្រូវឲ្យយកវិធីឈ្មោះ getBoxVolume មកប្រើតាមរយៈសិស្សឈ្មោះ boxInstance ដែលជាសិស្សនៃថ្នាក់ឈ្មោះ Box ។ យោងទៅតាមក្បួនច្បាប់នៅក្នុងភាសា JavaScript ការស្វែងរកវិធីនេះ គឺត្រូវធ្វើឡើងជាដំបូងនៅក្នុងសិស្សនោះជាមុនសិន រួចបានឡើងទៅថ្នាក់របស់វាជាក្រោយ រួចបានឡើងទៅថ្នាក់មេរបស់វាជាបន្តទៅទៀត។ វិធីឈ្មោះ getBoxVolume ត្រូវបានរកឃើញនៅក្នុងថ្នាក់ឈ្មោះ Box ព្រោះវាត្រូវបានបង្កើតឡើងនៅទីនោះ។
នៅលើបន្ទាត់លេខ 42 ការសរសេរថា boxInstance.pi គឺជាបញ្ជាតម្រូវឲ្យយកទិន្នន័យឈ្មោះ pi មកប្រើតាមរយៈសិស្សឈ្មោះ boxInstance ដែលជាសិស្សនៃថ្នាក់ឈ្មោះ Box ។ យោងទៅតាមក្បួនច្បាប់នៅក្នុងភាសា JavaScript ការស្វែងរកទិន្នន័យនេះ គឺត្រូវធ្វើឡើងជាដំបូងនៅក្នុងសិស្សនោះជាមុនសិន រួចបានឡើងទៅថ្នាក់របស់វាជាក្រោយ រួចបានឡើងទៅថ្នាក់មេរបស់វាជាបន្តទៅទៀត។ ទិន្នន័យឈ្មោះ pi ត្រូវបានរកឃើញនៅក្នុងថ្នាក់ឈ្មោះ ThreeD ព្រោះវាត្រូវបានបង្កើតឡើងនៅទីនោះ៕
ក៏ប៉ុន្តែ សំណួរបានចោទឡើងថា ហេតុដូចម្តេចបានជាយើងចាំបាច់ត្រូវបង្កើតទិន្ន័យនិងវិធីទាំងឡាយទុកនៅក្នុងវត្ថុឈ្មោះ prototype របស់ថ្នាក់និមួយៗ?
ចំលើយគឺថា នៅក្នុងភាសា JS ក្នុងករណីមានការបន្តថ្នាក់ ការស្វែងរកវត្ថុនិងឬអថេរដែលជាសម្បត្តិរបស់ថ្នាក់ទាំងឡាយ ត្រូវធ្វើឡើងនៅក្នុងវត្ថុពិសេសរបស់ថ្នាក់ ដែលមានឈ្មោះជា prototype នេះ។ បានន័យថា ទិន្នន័យនិងឬវិធីទាំងឡាយដែលត្រូវបានយកមកប្រើតាមរយសិស្សនៃថ្នាក់ណាមួយ នឹងត្រូវស្វែងនៅក្នុងវត្ថុដែលជាសិស្សនោះមុនគេ រួចបានឡើងទៅវត្ថុ ដែលជា prototype នៃថ្នាក់រង រួចបានឡើងទៅវត្ថុដែលជា prototype នៃថ្នាក់មេរហូតដល់អស់ថ្នាក់ បើសិនជារកមិនឃើញ។ អាស្រ័យហេតុនេះហើយ បានជាយើងចាំបាច់ត្រូវរក្សាទិន្នន័យនិងឬវិធីទាំងឡាយទុកនៅក្នុងវត្ថុដែលជា prototype របស់ថ្នាក់និមួយៗ៕