javascript
一个JavaScript上的OOP编程技巧:继承
其實這一次要說的東西是在很久以前就發現了的,在我知道博客園這個平臺以前也在一個現在已經廢棄了的blog上發了出來,但是來了博客園以后很長時間內我都苦于不知道怎么樣寫文章來講解比較好……
今天正好睡不著,就索性地來次隨性地發揮吧,反正每次都很正經地去說一件事情也是很累的……
?
在探索我馬上要介紹的這種技巧之前,我也見過一些文章介紹如何在JavaScript中實現類的繼承。但是,我總是覺得這些文章中好像是欠缺了點什么,帶著這種缺憾的感覺我就開始了并不算太認真的JavaScript——老實說,我更希望大家能用“ECMAScript”來稱呼它——探索旅程。
后來,我發現了一個技巧——其實這個技巧很早以前就被道大師開發出來,并且已經被用在了一些成熟的框架中了,但在我發現它的時候還很難找到文章去介紹它,大部分介紹JavaScript中的繼承的文章都是用那種又難看又buggy的方法……
?
?
好吧,也許你已經不耐煩了:隨性也用不著說這么多廢話吧?
其實那些讓我有缺憾感的地方,其中之一就是instanceof運算符的結果。
?
舉個例子說,如果我們有這樣的一個構造器:
function A(){ }那么當我們進行這樣的測試的時候:
new A() instanceof A我們得到的結果會是true。
?
但是,如果我們編寫一個構造器B,用以前的文章所講解的這樣那樣的方法來繼承自A,那么進行下面這樣的測試得到的結果通常會是false:
new B() instanceof A不過幸運的是,如果你看的是最近一年以內的文章,多半會介紹這樣的一種方法:
function A(){ } function B(){ } B.prototype = new A; B.prototype.constructor = B;經過這樣的處理再進行new B instanceof A的測試,得到的結果就應該是true了。
?
可能你會問了:“哎!?那A的函數體里面要是有對對象的初始化操作呢?B的實例不就沒有這些初始化了嗎?”
嘿嘿嘿,其實只要再這樣改一下就可以了:
function B(){A.apply(this, arguments); }怎么樣?今天你new B了嗎?
?
不過,到現在為止,new A和new B還是有一些缺憾,你能猜出來這次我說的缺憾是在哪嗎?
轉載于:https://www.cnblogs.com/NanaLich/archive/2010/05/20/javascript-inherit-make-instanceof-true.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的一个JavaScript上的OOP编程技巧:继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最新web 2.0 配色 (一)
- 下一篇: JavaScript设计模式—富有表现力