ای سی ایم اسکریپٹ آپریشن تبدیلی
- پچھلے پیج کلاس یا آٹھوٹ کی تعریف
- پائیدار پیج نکلیتی نظام کا مثال
ایکم اسیسپریٹ (ECMAScript) کا استعمال سے نہ صرف اوبجیکٹوں کی تخلیق کی جاسکتی ہے بلکہ موجودہ اوبجیکٹوں کا سلوک بھی تبدیل کیا جاسکتا ہے。
پروٹوٹایپ پراپرٹی نہ صرف کانسٹرکٹر کی پراپرٹی اور مینجمنٹ کا تعریف کر سکتا ہے بلکہ مقامی اوبجیکٹوں میں پراپرٹی اور مینجمنٹ بھی شامل کرسکتا ہے。
创建新方法
通过已有的方法创建新方法
可以用 prototype 属性为任何已有的类定义新方法,就像处理自己的类一样。例如,还记得 Number 类的 toString() 方法吗?如果给它传递参数 16,它将输出十六进制的字符串。如果这个方法的参数是 2,那么它将输出二进制的字符串。我们可以创建一个方法,可以把数字对象直接转换为十六进制字符串。创建这个方法非常简单:
Number.prototype.toHexString = function() { return this.toString(16); };
在此环境中,关键字 this 指向 Number 的实例,因此可完全访问 Number 的所有方法。有了这段代码,可实现下面的操作:
var iNum = 15; alert(iNum.toHexString()); //输出 "F"
由于数字 15 等于十六进制中的 F,因此警告将显示 "F"。
重命名已有方法
我们还可以为已有的方法命名更易懂的名称。例如,可以给 Array 类添加两个方法 enqueue() 和 dequeue(),只让它们反复调用已有的 push() 和 shift() 方法即可:
Array.prototype.enqueue = function(vItem) { this.push(vItem); }; Array.prototype.dequeue = function() { return this.shift(); };
添加与已有方法无关的方法
当然,还可以添加与已有方法无关的方法。例如,假设要判断某个项在数组中的位置,没有本地方法可以做这种事情。我们可以轻松地创建下面的方法:
Array.prototype.indexOf = function (vItem) { for (var i=0; i该方法 indexOf() 与 String 类的同名方法保持一致,在数组中检索每个项,直到发现与传进来的项相同的项目为止。如果找到相同的项,则返回该项的位置,否则,返回 -1。有了这种定义,我们可以编写下面的代码:
var aColors = new Array("red","green","blue"); alert(aColors.indexOf("green")); //خروجی "1"اضافه کردن روشهای جدید برای اپلای دیکشنریهای محلی
در نهایت، برای اینکه بتوانید روشهای جدیدی را برای همه اپلای دیکشنریهای محلی در ECMAScript اضافه کنید، باید آن را روی ویژگی prototype اپلای دیکشنری Object تعریف کنید. در فصلهای قبلی ذکر شده است که همه اپلای دیکشنریهای محلی از اپلای دیکشنری Object به ارث میبرند، بنابراین هرگونه تغییر در اپلای دیکشنری Object، در همه اپلای دیکشنریهای محلی反映 خواهد شد. به عنوان مثال، اگر بخواهید روشی برای نمایش ارزش فعلی اپلای دیکشنری با استفاده از پیامهای هشدار اضافه کنید، میتوانید از کد زیر استفاده کنید:
Object.prototype.showValue = function () { alert(this.valueOf()); }; var str = "hello"; var iNum = 25; str.showValue(); //خروجی "hello" iNum.showValue(); //خروجی "25"در اینجا، روشهای showValue() برای اپلای دیکشنری String و Number از اپلای دیکشنری Object به ارث برده شدهاند، و با فراخوانی این روشها روی اپلای دیکشنریهای آنها، "hello" و "25" نمایش داده میشود.
تغییر روشهای موجود
مانند این که میتوانید روشهای جدیدی برای کلاسهای موجود تعریف کنید، میتوانید روشهای موجود را نیز دوباره تعریف کنید. مانند آنچه که در فصلهای قبلی ذکر شده است، نامهای روشها فقط نشانههایی به سمت روشها هستند، بنابراین به راحتی میتوانند به روشهای دیگر اشاره کنند. اگر روشهای محلی مانند toString() را تغییر دهید، چه اتفاقی خواهد افتاد؟
Function.prototype.toString = function() { return "Function code hidden"; }
کد قبلی کاملاً معتبر است و نتیجه اجرا نیز کاملاً مطابق انتظار است:
function sayHi() { alert("hi"); } alert(sayHi.toString()); //خروجی "Function code hidden"
شاید شما یادتان باشد،در فصل Function اپلای دیکشنری Function روش toString() را معرفی کرده است که معمولاً کد منبع کارکرد را نمایش میدهد. با تغییر این روش، میتوانید یک رشته دیگر را بازگردانید (در این مثال، میتوانید "Function code hidden" را بازگردانید). اما،چه اتفاقی برای روش اصلی 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(); } };
在这段代码中,第一行代码把对当前 toString() 方法的引用保存在属性 originalToString 中。然后用定制的方法覆盖了 toString() 方法。新方法将检查该函数源代码的长度是否大于 100。如果是,就返回错误信息,说明该函数代码太长,否则调用 originalToString() 方法,返回函数的源代码。
بائنڈنگ کسی بھی طریقے سے نہیں
تکنیکی طور پر، بائنڈنگ کسی بھی طریقے سے نہیں موجود ہے۔ اس کتاب میں اس اصطلاح کو ECMAScript میں ایک افعال کی تشریح کے لئے استعمال کیا گیا ہے، جو آٹھوٹ کی انسٹنسی کے بعد اس کی متدوں کی تعریف کا امکان فراہم کرتا ہے۔ مثال کے لئے:
var o = new Object(); Object.prototype.sayHi = function () { alert("hi"); }; o.sayHi();
بہت سے پروگرامنگ زبانوں میں، آٹھوٹ کے حوالے کی تعریف قبل از آٹھوٹ کی انسٹنسیئیشن کے لازمی ہے۔ یہاں، method sayHi() آٹھوٹ کی کلاس Object کی ایک انسٹنسی کے بعد شامل کی گئی ہے۔ روایتی زبانوں میں اس طرح کی کوئی بات نہیں سنا گیا ہے، اس کے ساتھ ساتھ اس میں آٹھوٹ کی کلاس Object کی انسٹنسی کو خودکار طور پر فروغ دیا جاتا ہے اور فوری طور پر استعمال کیا جاسکتا ہے (آئندہ سطر میں)
توجہ:کسی بھی طریقے سے لگاتار بائنڈنگ کو استعمال نہیں کیا جانا چاہئے، کیونکہ اس کی ریکارڈنگ اور ریکارڈ کیاجانے میں مشکل آتی ہے۔ باوجود اس، اس کی ممکنہ حالت کو سمجھنا چاہئے。
- پچھلے پیج کلاس یا آٹھوٹ کی تعریف
- پائیدار پیج نکلیتی نظام کا مثال