本文實例講述了JavaScript面向對象程序設計中對象的定義和繼承。分享給大家供大家參考,具體如下:
我們提供的服務有:成都做網站、成都網站設計、微信公眾號開發(fā)、網站優(yōu)化、網站認證、青岡ssl等。為數(shù)千家企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的青岡網站制作公司
在面向對象的Javascript編程中,希望代碼優(yōu)雅有高效是非常重要的。javascript中不存在類的概念,只有對象。要想把Javascript代碼寫的像java 或者C++一樣優(yōu)雅,就得考慮如何去實現(xiàn),同時也要考慮性能和高效。定義javascript對象的方式有很多,繼承的方式也很多。通過不斷地實踐,推薦如下的方法:
(1)通過構造函數(shù)方式定義對象的所有非函數(shù)屬性
(2)用原型方式定義對象的函數(shù)屬性
采用這種方式,所有的屬性都是單一對象私有的,而方法則是所有對象公有的,對象之間的屬性不相互干擾,各個對象間共享同一個方法。
//使用原型+構造函數(shù)方式來定義對象 //構造函數(shù)定義對象的非函數(shù)屬性<strong> function Person() { this.username = new Array(); this.password = "123"; } //通過原型方式定義對象的函數(shù) Person.prototype.getInfo = function() { alert(this.username+","+this.password); }; var p = new Person(); var p2 = new Person(); p.username.push("zhangsan"); p2.username.push("lisi"); p.getInfo(); p2.getInfo();
在現(xiàn)實的開發(fā)過程中,我們可能希望開發(fā)的各個類(實質是對象)能像java程序中放到一個包中統(tǒng)一管理,統(tǒng)一使用,而各個對象相互獨立,同時避免對象重名等等因素,我們需要給每個類有個作用域,此時我們采用將對象放到自定匿名函數(shù)的方式來解決,這一點和jQuery開發(fā)插件的有點類似。代碼如下:
/** * @author jasson * @include common.js */ //對象存在就等于對象,對象不存在就創(chuàng)建{} var JassonChart = JassonChart || {}; (function(){ //構造函數(shù)定義對象的非函數(shù)屬性 function Person() { this.username = new Array(); this.password = "123"; } //通過原型方式定義對象的函數(shù) Person.prototype.getInfo = function() { alert(this.username+","+this.password); }; //將該類放到JassonChart中,類似java中的包,或者C++中的 JassonChart.Person= Person; }()); //調用該類庫中的Person類 var p = new JassonChart.Person();
這樣我們可以定義多個類,每個類都采用如上的方式實現(xiàn),這樣各個類相互都有作用域,非常規(guī)范。對于我們要用到的一些工具類,我們可以采用簡單的對象進行定義,代碼如下
/** * @author jasson */ var JassonChart = JassonChart || {}; JassonChart .util = { constants : { WIDTH : 'width', HEIGHT : 'height', SVG : 'SVG', CANVAS : 'CANVAS', G : 'G', //svg element STRING : 'string' }, distance : function(a, b) { var dx = a.x - b.x; var dy = a.y - b.y; return Math.sqrt(dx * dx + dy * dy); } };
在JavaScript中最好的方式就是用混合方式實現(xiàn)對象間的繼承。和定義對象一樣,我們可以將屬性和方法用不同的方式定義,用call或apply方式定義繼承對象的屬性,利用原型鏈的方式實現(xiàn)方法的繼承。如下代碼所示:
//使用混合的方式實現(xiàn)對象的繼承 function Parent(hello) { this.hello = hello;//定義父類的屬性 } Parent.prototype.sayHello = function()//定義父類的方法 { alert(this.hello); } function Child(hello,world) { Parent.call(this,hello);//繼承父類的屬性 //or Parent.apply(this,arguments);//繼承父類的屬性 this.world = world; } Child.prototype = new Parent();//繼承父類的方法 Child.prototype.sayWorld = function() { alert(this.world); } var child = new Child("hello","world"); child.sayHello(); child.sayWorld();
所謂"深拷貝",就是能夠實現(xiàn)真正意義上的數(shù)組和對象的拷貝。它的實現(xiàn)并不難,只要遞歸調用"淺拷貝"就行了。
function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === 'object') { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; }
使用的時候這樣寫:
var Doctor = deepCopy(Chinese);
現(xiàn)在,給父對象加一個屬性,值為數(shù)組。然后,在子對象上修改這個屬性:
Chinese.birthPlaces = ['北京','上海','香港']; Doctor.birthPlaces.push('廈門');
這時,父對象就不會受到影響了。
alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門 alert(Chinese.birthPlaces); //北京, 上海, 香港
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
本文標題:JavaScript面向對象程序設計中對象的定義和繼承詳解
當前網址:http://jinyejixie.com/article48/psiehp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、定制網站、Google、網站設計公司、網站設計、
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)