Muundo wa Kina ya Mtu wa Kina cha Kina cha ECMAScript
- Nyuma zaidi Kuandika kiwango au kiwango cha kifaa
- Pya zaidi Mfano wa uhusiano wa kusambaa
Kwa kutumia ECMAScript, inafikia kumekua uendelevu na kumfanya uendeshaji wa mambo yaliyopita.
Mafaniko wa hufikia kwa kufafanisha kwa sababu ya ujumbe na maadili, kwa hivyo hakuna mafanikio ya kumtaarifu.
创建新方法
通过已有的方法创建新方法
可以用 prototype 属性为任何已有的类定义新方法,就像处理自己的类一样。例如,还记得 Number 类的 toString() 方法吗?如果给它传递参数 16,它将输出十六进制的字符串。如果这个方法的参数是 2,那么它将输出二进制的字符串。我们可以创建一个方法,可以把数字对象直接转换为十六进制字符串。创建这个方法非常简单:
Number.prototype.toHexString = function() { return this.toString(16); };
Kwenye mazingira hii, kifungu this kinamaanisha matokeo ya Number, kwa hivyo tunaweza kufikia makosa yote ya Number. Kwa mtaarifu hii, tunaweza kufanya hili:
var iNum = 15; alert(iNum.toHexString()); // Inapokea "F"
Kwa sababu namba 15 inaeleza F katika isivivunji 16, walioonyesha tukionyesha F.
Ongeza jina la makosa yanayofikia
Tunaweza kuwaambia makosa yanayofikia kwa jina jingine jisieko. Kama mtaarifu, tunaweza kuongeza class Array kwa makosa enqueue() na dequeue() kwa kusababisha kweli makosa ya push() na shift():
Array.prototype.enqueue = function(vItem) { this.push(vItem); }; Array.prototype.dequeue = function() { return this.shift(); };
Ongeza makosa yanayotambulika na makosa yanayofikia
Tukizungumza, tunaweza kuongeza makosa yaliyotambulika na makosa yanayofikia. Kama mtaarifu, hadi hii tuna haki ya kuandika makosa yanayotambulika kama hili:
Array.prototype.indexOf = function (vItem) { for (var i=0; i<this.length; i++) { if (vItem == this[i]) { return i; } } return -1; }
Makosa indexOf() inaendana na makosa katika class String kwa jina lake, inafikia kila kiwango katika orodha hadi ikuwa na kiwango kilichotambulika kwa kiwango kilichopokea. Ikiwa kinaona kiwango kilichotambulika, itakubadilisha eneo lake, inaona -1. Kwa uadilifu huo, tunaweza kuandika maktaba ya hizi:
var aColors = new Array("red","green","blue"); alert(aColors.indexOf("green")); //输出 "1"
为本地对象添加新方法
最后,如果想给 ECMAScript 中每个本地对象添加新方法,必须在 Object 对象的 prototype 属性上定义它。前面的章节我们讲过,所有本地对象都继承了 Object 对象,所以对 Object 对象做任何改变,都会反应在所有本地对象上。例如,如果想添加一个用警告输出对象的当前值的方法,可以采用下面的代码:
Object.prototype.showValue = function () { alert(this.valueOf()); }; var str = "hello"; var iNum = 25; str.showValue(); //输出 "hello" iNum.showValue(); //输出 "25"
这里,String 和 Number 对象都从 Object 对象继承了 showValue() 方法,分别在它们的对象上调用该方法,将显示 "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() 方法,返回函数的源代码。
Uhusiano wa kusambaa wa kidini (Very Late Binding)
Kwa ujumbe, hauwa na uhusiano wa kusambaa wa kidini. Kitabu hiki kina tumia jina hilo kusoma kiwango cha ECMAScript, ambao kinaweza kuandika kifaa kwa kusababisha kwa kumwambia kifaa kabla ya kumwambia kifaa. Masaa:
var o = new Object(); Object.prototype.sayHi = function () { alert("hi"); }; o.sayHi();
Kwenye vijungu vya programu kwa kawaida, inahitajika kumaliza kuelewa kifaa kabla ya kumwambia kifaa. Hapa, kifaa sayHi() inatangazwa baada ya kumwambia kiwango cha Object. Kwenye lugha za kusababisha kama hizi, hayajulikana kwa sababu hizi huzingatia kwa uwezo wa kufikiria kiwango cha Object na kumwambia kiwango cha kufikiria cha kifaa cha Object kwa uwanja wa kwanza (kutengeneza kati).
Tahadhari:Haiwezi kutumika kwa uwezo wa uhusiano wa kusambaa wa kidini, kwa sababu hauwezi kufikiria na kurekodi. Inafikia, wakati huo, inafikia kuelewa hii inabofikia.
- Nyuma zaidi Kuandika kiwango au kiwango cha kifaa
- Pya zaidi Mfano wa uhusiano wa kusambaa