យើងបានដឹងរួចមកហើយថា សិស្សគឺជាវត្ថុដែលជាលទ្ធផលបានមកពីការយកថ្នាក់មកប្រើជាមួយនឹងប្រមាណសញ្ញា new ។ ដូចនេះសិស្សក៏មានលក្ខណៈដូចជាវត្ថុដទៃទៀតដែរ។ បានន័យថា នៅកន្លែងណាដែលវត្ថុផ្សេងៗទៀត អាចត្រូវយកទៅប្រើ សិស្សក៏អាចត្រូវយកទៅប្រើបានដូចគ្នាដែរ។ មួយវិញទៀត សិស្សគឺជាវត្ថុទទេស្អាតមួយ ក្រោយពីត្រូវបានបង្កើតឡើងរួចមក។ ក៏ប៉ុន្តែ សិស្សមានទំនាក់ទំនងយ៉ាងជិតស្និទ្ធ ជាមួយនឹងថ្នាក់របស់វា ហើយគឺដោយសារសិស្សនេះហើយ ដែលយើងអាចយកវិធីនិងទិន្នន័យនៅក្នុងថ្នាក់ ទៅប្រើនៅក្នុងដែនកំណត់ដទៃទៀតបាន។
យើងគួរតែរំលឹកឡើងវិញថា នៅពេលដែលយើងយកវិធីមកប្រើតាមរយៈសិស្សណាមួយ សិស្សនោះនឹងត្រូវផ្តល់ជាដំណឹង ឲ្យទៅវិធីនោះជាស្វ័យប្រវត្តិ។ នេះគឺជាក្បួនច្បាប់នៅក្នុងភាសា JavaScript ។
ប្រការដែលសំខាន់មួយទៀតគឺថា សិស្សគឺជាវត្ថុដែលជាកន្លែងទទេស្អាតមួយនៅក្នុងសតិរបស់កំព្យូទ័រ។ ប្រការនេះធ្វើឲ្យយើងអាចបង្កើតទិន្នន័យមួយចំនួនទុកនៅក្នុងសិស្សនោះបាន។ ហើយដើម្បីបង្កើតទិន្នន័យផ្សេងៗទុកនៅក្នុងសិស្ស យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
function Area(){};
Area.prototype.pi = 3.14;
Area.prototype.rectangle = function(width, height){
var surface = width * height;
return surface;
}
var instance = new Area();
//បង្កើតទិន្នន័យឈ្មោះ width ទុកក្នុងសិស្សឈ្មោះ instance
instance.width = 25;
//បង្កើតទិន្នន័យឈ្មោះ height ទុកក្នុងសិស្សឈ្មោះ instance
instance.height = 5;
console.log('ប្រវែងរបស់ width គឺ៖ '+instance.width);
console.log('ប្រវែងរបស់ height គឺ៖ '+instance.height);
នៅលើបន្ទាត់លេខ 12 ការសរសរថា instance.width = 25 គឺជាបញ្ជាតម្រូវឲ្យបង្កើតទិន្នន័យឈ្មោះ width មួយ ទុកនៅក្នុងសិស្សឈ្មោះ instance នៃថ្នាក់ឈ្មោះ Area ។
នៅលើបន្ទាត់លេខ 15 ការសរសរថា instance.height = 5 គឺជាបញ្ជាតម្រូវឲ្យបង្កើតទិន្នន័យឈ្មោះ height មួយ ទុកនៅក្នុងសិស្សឈ្មោះ instance នៃថ្នាក់ឈ្មោះ Area ។
សរុបមក យើងឃើញថានៅក្នុងសិស្សឈ្មោះ instance មានវត្ថុដែលជាទិន្នន័យពីរ ត្រូវបានបង្កើតទុកនៅទីនោះ។ ហើយជាទូទៅ យើងហៅបណ្តាទិន្នន័យដែលមាននៅក្នុងសិស្សទាំងនោះថាជា ទិន្នន័យសិស្ស (instance attribute) ដែលអាចជាវត្ថុនិងឬអថេរប្រភេទណាក៏បានដែរ។
លើសពីនេះទៀត ការបង្កើតទិន្នន័យសិស្សអាចត្រូវធ្វើឡើងតាមរបៀបម៉្យាងទៀត ដូចខាងក្រោមនេះ៖
function Area(){
//ការបង្កើតទិន្នន័យទុកក្នុងសិស្ស
this.width = 25;
this.height = 5;
}
Area.prototype.pi = 3.14;
Area.prototype.rectangle = function(width, height){
var surface = width * height;
return surface;
}
var instance = new Area();
//ការយកទិន្នន័យសិស្សមកប្រើ
console.log('ប្រវែងរបស់ width គឺ៖ '+instance.width);
console.log('ប្រវែងរបស់ height គឺ៖ '+instance.height);
នៅលើបន្ទាត់លេខ 3 ការសរសេរថា this.width = 25 គឺជាបញ្ជាតម្រូវឲ្យបង្កើតទិន្នន័យសិស្សមួយ មានឈ្មោះថា width ទុកនៅក្នុងសិស្ស ដែលនឹងត្រូវបង្កើតឡើង នៅពេលដែលថ្នាក់ឈ្មោះ Area នឹងត្រូវយកទៅប្រើជាមួយនឹងប្រមាណសញ្ញា new ។
នៅលើបន្ទាត់លេខ 4 ការសរសរថា this.height = 5 គឺជាបញ្ជាតម្រូវឲ្យបង្កើតទិន្នន័យសិស្សមួយទៀត មានឈ្មោះថា height ទុកនៅក្នុងសិស្ស ដែលនឹងត្រូវបង្កើតឡើង នៅពេលដែលថ្នាក់ឈ្មោះ Area នឹងត្រូវយកទៅប្រើជាមួយនឹងប្រមាណសញ្ញា new ។
នៅលើបន្ទាត់លេខ 13 ការសរសរថា var instance = new Area() គឺជាបញ្ជាតម្រូវឲ្យបង្កើតសិស្សមួយមានឈ្មោះថា instance ដែលជាសិស្សនៃថ្នាក់ឈ្មោះ Area ។ ដោយយោងទៅតាមក្បួនច្បាប់នៅក្នុងភាសា JavaScript ទិន្នន័យសិស្ស ដែលជាអថេរឈ្មោះ width និង height ត្រូវបានបង្កើតឡើង និងទុកនៅក្នុងសិស្សឈ្មោះ instance នោះ។
ដូចនេះយើងឃើញថា ការយកថ្នាក់មកប្រើជាមួយនឹងប្រមាណសញ្ញា new អាចជាបញ្ជាពីរកើតឡើងក្នុងពេលតែមួយ។ គឺថា បញ្ជាទីមួយ គឺជាការបង្កើតវត្ថុមួយដែលជាសិស្ស ចំណែកឯបញ្ជាទីពីរវិញ គឺជាការបង្កើតទិន្នន័យផ្សេងៗសម្រាប់សិស្សនោះ។ មួយវិញទៀត ដោយយើងអាចបង្កើតទិន្នន័យសិស្សនៅក្នុងក្បួនដែលត្រូវយកមកប្រើប្រាស់សម្រាប់បង្កើតថ្នាក់ផងដែរនោះ ដូចនេះក្បួននោះមានតួនាទីសំខាន់ណាស់ នៅក្នុងការបង្កើតថ្នាក់ និងនៅក្នុងការបង្កើតទិន្នន័យសិស្ស។ ហើយជាទូទៅ គេនិយមហៅក្បួននោះថាជា ស្ថាបនិក (constructor) ព្រោះមាននាទីជាអ្នកបង្កើតថ្នាក់និងទិន្នន័យសិស្ស។
នៅលើបន្ទាត់លេខ 16 ការសរសេរថា instance.width គឺជាបញ្ជាតម្រូវឲ្យយកទិន្នន័យសិស្ស ដែលជាអថេរមានឈ្មោះថា width នៅក្នុងសិស្សឈ្មោះ instance យកមកប្រើការ។
នៅលើបន្ទាត់លេខ 17 ការសរសេរថា instance.height គឺជាបញ្ជាតម្រូវឲ្យយកទិន្នន័យសិស្ស ដែលជាអថេរមានឈ្មោះថា height នៅក្នុងសិស្សឈ្ម៉ោះ instance យកមកប្រើការ។
ក្រោយពីទិន្នន័យសិស្សត្រូវបានបង្កើតរួចមក យើងអាចយកវត្ថុទាំងនោះទៅធ្វើការដោះដូរតម្លៃរបស់វាបានគ្រប់ពេលវេលា។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
function Area(){
//ការបង្កើតទិន្នន័យទុកក្នុងសិស្ស
this.width = 25;
this.height = 5;
}
Area.prototype.pi = 3.14;
Area.prototype.rectangle = function(width, height){
var surface = width * height;
return surface;
}
Area.prototype.setValue = function(){
this.width = 30;
}
var instance = new Area();
//ការយកវិធី setValue មកប្រើដើម្បីកំណត់តំលៃទិន្នន័យសិស្ស
instance.setValue();
console.log('ប្រវែង width ថ្មីគឺ៖ '+instance.width);
//ការដូរតំលៃទិន្នន័យសិស្សដោយផ្ទាល់
instance.height = 10;
console.log('ប្រវែង height ថ្មីគឺ៖ '+instance.height);
នៅលើបន្ទាត់លេខ 14 ការសរសរថា this.width = 30 គឺជាបញ្ជាតម្រូវឲ្យប្តូរតម្លៃនៃទិន្នន័យសិស្ស ដែលជាអថេរឈ្មោះ width ឲ្យទៅជាលេខ 30 វិញ។
នៅលើបន្ទាត់លេខ 25 ការសរសរថា instance.height = 10 គឺជាបញ្ជាតម្រូវឲ្យប្តូរតម្លៃនៃទិន្នន័យសិស្ស ដែលជាអថេរឈ្មោះ height ឲ្យទៅជាលេខ 10 វិញ។
ដូចនេះ យើងសង្កេតឃើញថា ការផ្លាស់ប្តូរទិន្នន័យសិស្ស អាចត្រូវធ្វើឡើនៅក្នុងថ្នាក់ នៅក្នុងវិធីផ្សេងៗក៏បាន និងឬនៅខាងក្រៅថ្នាក់តាមរយៈសិស្សរបស់ថ្នាក់ក៏បាន។
ការបង្កើតសិស្ស ក៏ជាការបង្កើតដែនកំណត់មួយដែរ ដូចនេះទិន្នន័យសិស្សមិនអាចត្រូវច្រឡំទៅនឹងទិន្នន័យសិស្សផ្សេងៗទៀតបានឡើយ ទោះបីជាវត្ថុនិងឬអថេរទាំងនោះមានឈ្មោះដូចគ្នាក៏ដោយ។ ហើយនៅពេលដែលយើងយកទិន្នន័យរបស់សិស្សណាមួយមកប្រើ ការស្វែងរកវត្ថុនោះត្រូវធ្វើឡើងនៅក្នុងសិស្សនោះមុន រួចបានឡើងទៅថ្នាក់រប់សសិស្សនោះ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
function Area(pi){
//គំរោងបង្កើតទិន្នន័យសិស្សខុសៗគ្នា
this.pi = pi;
}
Area.prototype.rectangle = function(width, height){
var surface = width * height;
return surface;
}
var instance1 = new Area(3.1415);
var instance2 = new Area(3.141592);
console.log('ទិន្នន័យឈ្មោះ pi របស់ instance1 គឺ៖ ' + instance1.pi);
console.log('ទិន្នន័យឈ្មោះ pi របស់ instance2 គឺ៖ ' + instance2.pi);
នៅលើបន្ទាត់លខ 11 ការសរសេរថា var instance1 = new Area(3.1415) គឺជាបញ្ជាតម្រូវឲ្យបង្កើតសិស្សឈ្មោះ instance1 មួយដែលនៅក្នុងនោះមានទិន្នន័យមួយមានឈ្មោះថា pi ដែលជាលេខ 3.1415 ។
នៅលើបន្ទាត់លខ 12 ការសរសេរថា var instance2 = new Area(3.141592) គឺជាបញ្ជាតម្រូវឲ្យបង្កើតសិស្សឈ្មោះ instance2 មួយដែលនៅក្នុងនោះមានទិន្នន័យមួយមានឈ្មោះថា pi ដែលជាលេខ 3.141592 ។
ដូចនេះយើងឃើញថា instance1 និង instance2 មានទិន្នន័យមានឈ្មោះ pi ដូចគ្នា តែទិន្នន័យទាំងពីរនោះគឺជាអថេរពីរខុសគ្នា ព្រោះវាស្ថិតនៅក្នុងដែនកំណត់ដែលជាសិស្សពីរផ្សេងគ្នា។
មានរបៀបម៉្យាងទៀត ដែលអនុញ្ញាតអោយយើងអាចយកទិន្នន័យថ្នាក់ឬទិន្នន័យសិស្សមកប្រើការឬមកដោះដូរតំលៃរបស់វាបាន ដោយប្រើប្រាស់ក្បួនមានឈ្មោះតែមួយ។ ជាភាសាអង់គ្លេស គេហៅក្បួននោះថាជា getter និង setter ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
function Area(pi){
//គំរោងបង្កើតទិន្នន័យសិស្សខុសៗគ្នា
this.pi = pi;
}
//បង្កើតក្បួន setter & getter ដើម្បីដោះដូរឬយកទិន្នន័យសិស្ស pi មកប្រើ
Object.defineProperties(Area.prototype, {
"PI":{
get: function(){
return this.pi;
},
set: function(value) {
this.pi = value;
}
},
})
Area.prototype.rectangle = function(width, height){
var surface = width * height;
return surface;
}
var instance = new Area(3.14);
//ប្តូរតំលៃទិន្នន័យសិស្ស pi តាមរយៈក្បួន setter
instance.PI = 3.1415;
//យកទិន្នន័យសិស្ស pi មកប្រើតាមរយៈក្បួន getter
console.log("តំលៃចុងក្រោយរបស់ទិន្នន័យសិស្ស pi គឺ "+instance.PI);
ចាប់ពីបន្ទាត់លេខ 7 ដល់បន្ទាត់លេខ 16 គឺជាការបង្កើតក្បួន getter និង setter មានឈ្មោះតែមួយថា PI() ក្នុងគោលបំណងដោះដូរឬចំលងយកតំលៃនៃទិន្នន័យសិស្ស pi មកប្រើការ។
នៅលើបន្ទាត់លេខ 24 គឺជាការយកក្បួន setter PI() មកប្រើដើម្បីដោះដូរតំលៃរបស់ទិន្នន័យសិស្ស pi ។
នៅលើបន្ទាត់លេខ 26 គឺជាការយកក្បួន getter PI() មកប្រើដើម្បីចំលងយកទិន្នន័យសិ្ស pi មកប្រើការ៕