ການດັດແກ້ບັນດາບັນຊີ ECMAScript

ການໃຊ້ ECMAScript ສາມາດສ້າງອາກາດ ແລະ ປ່ຽນການສະແດງອາກາດທີ່ມີຢູ່.

ຄວາມລວມ prototype ສາມາດກໍ່ຕັ້ງປະກອບອາກາດ ແລະ ກົນລະຍຸດຂອງການສ້າງຄອມທີ່ສ້າງຕົ້ນ ກໍ່ສາມາດກໍ່ຕັ້ງປະກອບອາກາດ ແລະ ກົນລະຍຸດສໍາລັບອາກາດທ້ອງຖິ່ນ.

ສ້າງການໃຊ້ທີ່ຈະພົບກັບການໃຊ້ທີ່ມີກ່ອນ

ສ້າງການໃຊ້ທີ່ຈະພົບກັບການໃຊ້ທີ່ມີກ່ອນ

ພວກເຮົາສາມາດໃຊ້ປະເພດ prototype ເພື່ອການອອກຂໍ້ມູນທີ່ຈະປະເພດທີ່ມີກ່ອນ, ຄືກັບການທຳນາຍຂອງພວກເຮົາ. ຕົວຢ່າງ, ພວກເຮົາຈະຈືດຄວາມຮູ້ຂອງການໃຊ້ toString() ຂອງ Number. ຖ້າຂ້ອຍສົ່ງຄຳສັ່ງ 16, ມັນຈະສະແດງຄືກັບຈຳນວນສາມາດແມ່ນຫນັງ. ຖ້າຄຳສັ່ງແມ່ນ 2, ມັນຈະສະແດງຄືກັບຈຳນວນສາມາດແມ່ນສະໝອງ. ພວກເຮົາສາມາດສ້າງການໃຊ້ທີ່ສາມາດປ່ຽນຈຳນວນໄດ້ທັງໝົດ:

Number.prototype.toHexString = function() {
  return this.toString(16);
};

ໃນການໃຊ້ທີ່ນີ້, ຄຳປະໝາດ this ອານນະພາບຂອງ Number, ເພື່ອສາມາດເຂົ້າເຖິງຂັ້ນມະນາດທັງໝົດຂອງ Number. ກັບການເຮັດວຽກນີ້, ພວກເຮົາສາມາດເຮັດການດັ່ງຕໍ່ໄດ້:

var iNum = 15;
alert(iNum.toHexString());		//ສະແດງ "F"

TIY

ເພາະຈະມີຈຳນວນ 15 ທຽບກັບ F ໃນພາສາເອັກຊຽນ, ການແຈ້ງຄວາມຈະສະແດງຄື "F".

ປ່ຽນຊື່ການໃຊ້ປະເພດ

ພວກເຮົາສາມາດປ່ຽນຊື່ການໃຊ້ປະເພດທີ່ມີຄວາມລະບຸບບັນດາ. ຕົວຢ່າງ, ພວກເຮົາສາມາດໃຫ້ Array ມີການໃຊ້ enqueue() ແລະ dequeue(), ເພື່ອການເຮັດການກັບ push() ແລະ shift() ທີ່ມີກ່ອນ:

Array.prototype.enqueue = function(vItem) {
  this.push(vItem);
};
Array.prototype.dequeue = function() {
  return this.shift();
};

TIY

ຕ້ອງການຕ້ອງການຕ້ອງການຕ້ອງການຕ້ອງການ

ຕື່ມພວກນັ້ນກັບການໃຊ້ປະເພດທີ່ບໍ່ມີການໃຊ້ກັບການໃຊ້ປະເພດທີ່ມີກ່ອນ. ຕົວຢ່າງ, ກໍ່ຈະຕ້ອງການກວດສອບບັນດາບັນດາທີ່ຢູ່ໃນບັນດາບັນດາ, ບໍ່ມີການໃຊ້ປະເພດທີ່ສາມາດເຮັດຢູ່. ພວກເຮົາສາມາດສ້າງການໃຊ້ປະເພດທີ່ພົບກັບພວກນັ້ນທີ່ພົບກັບພວກນັ້ນ:

Array.prototype.indexOf = function (vItem) {
  for (var i=0; i<this.length; i++) {
    if (vItem == this[i]) {
	  return i;
	}
  }
  return -1;
}

ການໃຊ້ indexOf() ພົບກັບການໃຊ້ indexOf() ທີ່ພາຍໃນປະເພດ String ທັງຫນັງການຊອກຫາຊະນວນບັນດາບັນດາທີ່ຈະພົບກັບບັນດາບັນດາທີ່ຂ້ອຍສົ່ງມາ. ຖ້າພົບບັນດາບັນດາທີ່ບໍ່ຄິດຮູ້, ຈະກັບຄືນອີກ -1.

var aColors = new Array("red","green","blue");
alert(aColors.indexOf("green"));	//输出 "1"

TIY

ກັບຕົວຊີວິດທີ່ມີຢູ່ທຸກສິ່ງ

ສຸດທ້າຍຖ້າຕ້ອງການກັບຕົວຊີວິດທີ່ມີຢູ່ທຸກສິ່ງພາຍໃນ ECMAScript ຈະຕ້ອງການກໍ່ຕັ້ງພວກມັນໃນ attribute prototype ຂອງ Object object. ຍັງມີຫົວຂໍ້ທີ່ກ່າວໄວ້ໃນຫົວຂໍ້ນີ້ວ່າທຸກສິ່ງພາຍໃນລະບົບທີ່ມີຢູ່ປັດຈຸບັນທັງໝົດຈະຖືກຖືກລວມເຂົ້າໃນ Object object. ຕົວຢ່າງວ່າການຕ້ອງການກັບ Object object ຈະສະແດງອອກຕາມພວກມັນທຸກສິ່ງ. ເປັນຕົວຢ່າງການຕ້ອງການກັບກົດລະບຽບທີ່ອອກອາກາດຄຳວ່າວ່າ "green" ຂອງພາຍໃນລະບົບພາຍໃນສິ່ງທີ່ມີຢູ່ປັດຈຸບັນຈະສະແດງອອກຕາມຄວາມຄາດຫວັງ:

Object.prototype.showValue = function () {
  alert(this.valueOf());
};
var str = "hello";
var iNum = 25;
str.showValue();		//ອອກອາກາດ "hello"
iNum.showValue();		//ອອກອາກາດ "25"

TIY

ມັນນີ້ String ແລະ Number object ທັງສອງທີ່ຖືກສ້າງຈາກ Object object ເຮັດການເອິ້ນກົດລະບຽບ showValue() ພາຍໃນອົງຂອງພວກມັນເພື່ອສະແດງ "hello" ແລະ "25".

ປ່ຽນແປງພວກມັນຄືນທີ່ມີຢູ່ປັດຈຸບັນ

ຄືກັບການສ້າງພວກມັນຄືນພາຍໃນນາຍພິກັນທີ່ມີຢູ່ປັດຈຸບັນ ການປ່ຽນແປງພວກມັນຄືນກັບພວກມັນທີ່ມີຢູ່ປັດຈຸບັນ. ຍັງມີຫົວຂໍ້ທີ່ກ່າວໄວ້ໃນຫົວຂໍ້ນີ້ວ່າຊື່ພວກມັນມີຜົນງານຫຼາຍເປັນຄືນຫຼາຍຫົວຂໍ້. ຖ້າພະຍາຍາມການປ່ຽນແປງພວກມັນທີ່ຢູ່ທີ່ປະຈຳລະບົບຈະມີການຫາກັບພວກມັນ?

Function.prototype.toString = function() {
  return "Function code hidden";
}

ການຂຽນລະບົບກ່ອນນີ້ຍັງມີຄວາມຖືກຕ້ອງຄືນ ການດຳເນີນຄະນະພາບຈະສະແດງອອກຕາມຄວາມຄາດຫວັງ:

function sayHi() {
  alert("hi");
}
alert(sayHi.toString());	//ອອກອາກາດ "Function code hidden"

TIY

ພວກເຈົ້າຮູ້ວ່າຫຼັງຈາກມີການອ່ານ Function Object ໃນຫົວຂໍ້ນີ້ Function toString() method ທີ່ອອກອາກາດແມ່ນສະແດງໃຫ້ເຫັນລະບົບພາບຂອງພວກມັນ. ພະຍາຍາມການປ່ຽນແປງພວກມັນສະແດງອອກໃຫ້ເຫັນຄຳກົດໝາຍພາບສະແດງວ່າ "Function code hidden"). ແຕ່ວ່າ Function toString() ທີ່ຈະນຳໄປຫາຫົວຂໍ້ທີ່ໃດກໍ່ຕາມ? ມັນຈະຖືກກູ້ຄືນໂດຍໂຄງການກູ້ຄືນສະຖານທີ່ບໍ່ມີຜົນໃຊ້ຄືນຈາກມັນຖືກໃຊ້ຢ່າງສົມບູນ. ບໍ່ມີວິທີທີ່ຈະຟື້ນຟູຫົວຂໍ້ທິດທາງເລື່ອງຈະຫຼຸດລົງ. ຍ້ອນແນວນັ້ນ ການກະກຽມສິ່ງຂອງຫົວຂໍ້ທິດທາງເລື່ອງກ່ອນການປ່ຽນແປງຫົວຂໍ້ທິດທາງເລື່ອງຈະເປັນການກະລຸນາຫຼາຍ. ບາງຄັ້ງເຈົ້າອາດຈະເອິ້ນຫົວຂໍ້ທິດທາງເລື່ອງທີ່ໃຫ້ຈະປ່ຽນແປງຫຼັງນັ້ນ:

Function.prototype.originalToString = Function.prototype.toString;
Function.prototype.toString = function() {
  if (this.originalToString().length > 100) {
    return "Function too long to display.";
  } else {
    return this.originalToString();
  }
};

TIY

在这段代码中,第一行代码把对当前 toString() 方法的引用保存在属性 originalToString 中。然后用定制的方法覆盖了 toString() 方法。新方法将检查该函数源代码的长度是否大于 100。如果是,就返回错误信息,说明该函数代码太长,否则调用 originalToString() 方法,返回函数的源代码。

极晚绑定(Very Late Binding)

从技术上讲,根本不存在极晚绑定。本书采用该术语描述 ECMAScript 中的一种现象,即能够在对象实例化后再定义它的方法。例如:

var o = new Object();
Object.prototype.sayHi = function () {
  alert("hi");
};
o.sayHi();

TIY

在大多数程序设计语言中,必须在实例化对象之前定义对象的方法。这里,方法 sayHi() 是在创建 Object 类的一个实例之后来添加进来的。在传统语言中不仅没听说过这种操作,也没听说过该方法还会自动赋予 Object 对象的实例并能立即使用(接下来的一行)。

ຄໍາເຕືອນ:ບໍ່ອາດຈະນຳໃຊ້ວິທີການຮັບອານຸສາວະລີຫລັງນີ້ຍ້ອນມັນຍາກຕາດຕາຍຫລືບັນທຶກ. ແຕ່ຍັງຄວນຮູ້ວ່າມັນສາມາດມີຄວາມເປັນໄປໄດ້.