|
JScript中的prototype(原型)屬性研究(2) 上次的文章中我羅列了一下prototype屬性在JScript中的各種用法,但是prototype這個東西卻不是JScript創(chuàng)造出來的,JScript實際上是使用了我們設(shè)計模式中prototype pattern的一種衍生形式。下面我先簡單的說一下prototype pattern,然后再來看到底JScript中的prototype是怎么回事
What‘s prototype pattern? Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype. 用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。 原型模式允許一個對象再創(chuàng)建另外一個可定制的對象,根本無需知道任何如何創(chuàng)建的細節(jié),工作原理是:通過將一個原型對象傳給那個要發(fā)動創(chuàng)建的對象,這個要發(fā)動創(chuàng)建的對象通過請求原型對象拷貝它們自己來實施創(chuàng)建。 繼續(xù)了解到底什么是prototype pattern,可以參看‘設(shè)計模式之Prototype(原型)‘這篇文章,即使不懂Java也沒有關(guān)系,把它的代碼都當C#看就行了 搞清楚什么是原型了吧?反正記著一點,prototype pattern是的實現(xiàn)是依賴于clone這個操作的,當然要shallow copy還是deep copy的clone看自己的需要了。 下面我們繼續(xù)說JScript里的prototype,為什么我們說它和prototype pattern里的prototype不一樣呢?! 這個不是我說就說出來的,也不是我吹出來的,看看這個示例,你就能大概糊涂: ![]() <script language="javascript">![]() function RP()![]() ![]() { RP.PropertyA = 1; RP.MethodA = function()![]() { alert("RP.MethodA "); }; this.PropertyA = 100; this.MethodA = function()![]() { alert("this.MethodA"); }; }![]() RP.prototype.PropertyA = 10; RP.prototype.MethodA = function()![]() ![]() { alert("RP.prototype.MethodA"); }; </script>不要著急,還沒有開始做示例,只是給出了我們用來演示的一個類。RP是什么?rpwt嗎?當然不是了,RP是ResearchPrototype了 ![]() <script language="javascript">![]() rp = new RP(); alert(RP.PropertyA); RP.MethodA(); alert(rp.PropertyA); rp.MethodA(); </script>運行結(jié)果閃亮登場: 1
RP.MethodA 100 this.MethodA 這個%$@#^$%&^...,不要著急,繼續(xù)看哦! ![]() <script language="javascript">![]() rp = new RP(); delete RP.PropertyA; alert(RP.PropertyA); delete RP.MethodA; RP.MethodA(); delete rp.PropertyA; alert(rp.PropertyA); delete rp.MethodA; rp.MethodA(); </script>運行結(jié)果再次登場: undefined
A Runtime Error has occurred. Do you wish to Debug? Line: 32
Error: Object doesn‘t support this property or method 10 RP.prototype.MethodA
![]() <script lanuage="javascript">![]() String.prototype.trim()![]() ![]() { return this.replace(/(^\s+)|(\s+$)/g, ""); } </scritp> 顯然JScript中的這種用法也是prototype pattern中的prototype不能解釋和支持的。 <html> <head> <meta name="author" content="birdshome@博客園"> <title>JScript Prototype Research</title> </head> <body>![]() <script language="javascript">![]() function RP()![]() ![]() { RP.PropertyA = 1; RP.MethodA = function()![]() { alert("RP.MethodA "); }; this.PropertyA = 100; this.MethodA = function()![]() { alert("this.MethodA"); }; }![]() RP.prototype.PropertyA = 10; RP.prototype.MethodA = function()![]() ![]() { alert("RP.prototype.MethodA"); }; </script>![]() <script language="javascript">![]() rp = new RP(); delete RP.PropertyA; alert(RP.PropertyA); delete RP.MethodA; RP.MethodA(); delete rp.PropertyA; alert(rp.PropertyA); delete rp.MethodA; rp.MethodA(); </script> </body> </html>![]()
|
|
|