摘要:這兩個都是用字面量方法創(chuàng)建的普通對象,不是構(gòu)造函數(shù)無法使用構(gòu)造函數(shù)的原型鏈繼承的方法的實現(xiàn)繼承。
1.最近一直再看javascript高級程序設(shè)計3,面向?qū)ο笳鹿?jié),前面寫了兩篇讀書筆記
(1)構(gòu)造函數(shù) --創(chuàng)建對象 (2)構(gòu)造函數(shù)的原型鏈繼承 現(xiàn)在又在網(wǎng)上看到阮一峰大大的一篇非構(gòu)造函數(shù)繼承的文章,特意借來學(xué)習(xí)一下!
非構(gòu)造函數(shù)繼承--阮一峰
一:什么是非構(gòu)造函數(shù)的繼承? 比如:一個對象叫做中國人 一個對象叫做醫(yī)生
var Chinese = { nation:"中國" } var doctor = { career:"醫(yī)生" }
怎樣才能讓“醫(yī)生”去繼承“中國人”,也就是說,我怎樣才能生成一個“中國醫(yī)生”的對象?
這里注意。這兩個都是用字面量方法創(chuàng)建的普通對象,不是構(gòu)造函數(shù)無法使用構(gòu)造函數(shù)的原型鏈繼承的方法的實現(xiàn)繼承。
第一種:object方法
json格式發(fā)明人提出的一種方法
function object(o){ function F(){}; // 創(chuàng)建一個空構(gòu)造函數(shù) F.prototype = o; // 原型對象指向父對象 return new F(); }
這個object函數(shù)的作用就是將子對象的prototype屬性指向父對象,從而使的父子對象連在一起
(1)使用時先在父對象基礎(chǔ)聲稱子對象
var Doctor = object(Chinese);
(2)然后給自對象賦上自己的屬性
var Doctor.carrer = "醫(yī)生";
(3)這樣子對象就繼承了父對象的屬性了
alert(Doctor.nation); // "醫(yī)生"
第二種:淺拷貝
除了使用“prototype”鏈以外,還有另一種思路:就是把父對象的屬性,全部拷貝給子對象,也能實現(xiàn)繼承。 下面這個函數(shù),就是在做拷貝:
function extendCoby(p){ var c = {}; for(var i in p){ c[i] = p[i]; } c.uber = p; // 軟大大:uber是一個德語詞,意思是"向上"、"上一層" return c; }
使用的時候,這樣寫 var Doctor = extend(Chinese); Doctor.carrer = "醫(yī)生"; alert(Doctor.nation); // 中國
但是這樣的拷貝有一個問題。那就是,如果父對象的屬性等于數(shù)組或另一個對象,那么實際上,子對象獲得的只是一個內(nèi)存地址,而不是真正的拷貝,因此存在父對象被篡改的可能。
請看現(xiàn)在給Chinese添加一個出生地屬性,它的值是一個數(shù)組。
Chinese.birthPlace = ["北京","上海","香港"];
通過extendCopy()函數(shù),Docttor繼承了Chinese
var Doctor = extendCopy(Chinese);
然后我們?yōu)槌錾靥砑右粋€城市:
Doctor.birthPlace.push("廈門");
此時,發(fā)生了什么事?
alert(Doctor.birthPlace); // 北京,上海,香港,廈門 alert(Chinese.birthPlace); // 北京,上海,香港,廈門
所以,extendCopy()只是拷貝基本數(shù)據(jù)類型,我們把這種拷貝叫做淺拷貝。
這是早期的jquery實現(xiàn)繼承的方式
第三種 深拷貝
所謂深拷貝,就是能夠真正意義上的數(shù)組和對象的拷貝。 它的實現(xiàn)并不難,只要遞歸調(diào)用淺拷貝就可以啦
function deepCopy(p,c){ //參數(shù)p,c順序萬不可寫反,因為第一次c為空 var c = c || {}; // 第一次執(zhí)行函數(shù)的時候 c為 空對象 for(var i in p){ if(typeof p[i] === "object"){ // 判斷對象p的一個屬性值是否為復(fù)雜數(shù)據(jù)類型object或array // [] 或 {} 判斷 c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i],c[i]); // 遞歸調(diào)用此方法 }else{ c[i] = p[i]; //簡單數(shù)據(jù)類型直接賦值 } } return c; // 將新對象c返回出來 } var Chinese = { nation:"中國", place:["A","B","C"], say:function(){ alert(this.nation); } } var Doctor = deepCopy(Chinese); // 調(diào)用deepCopy創(chuàng)建新對象 Doctor.carrer = "醫(yī)生"; Doctor.place.push("X"); console.log(Doctor); console.log(Chinese);
此方法是目前jq實現(xiàn)集成的方法
感悟:個人感覺此方法只適用簡單方法,不適合復(fù)雜對象,復(fù)雜對象還是得靠構(gòu)造函數(shù)原型鏈的繼承!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81180.html
摘要:原文鏈接一什么是非構(gòu)造函數(shù)的繼承比如,現(xiàn)在有一個對象,叫做中國人。通過函數(shù),繼承了。中國北京上海香港廈門北京上海香港廈門北京上海香港這時,父對象就不會受到影響了。目前,庫使用的就是這種繼承方法。 原文鏈接 一、什么是非構(gòu)造函數(shù)的繼承? 比如,現(xiàn)在有一個對象,叫做中國人。 var Chinese = { nation: 中國 } 還有一個對象,叫做醫(yī)生。 var Doctor = {...
摘要:對象重新認識面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計模式上看,對象是計算機抽象現(xiàn)實世界的一種方式。除了字面式聲明方式之外,允許通過構(gòu)造器創(chuàng)建對象。每個構(gòu)造器實際上是一個函數(shù)對象該函數(shù)對象含有一個屬性用于實現(xiàn)基于原型的繼承和共享屬性。 title: JS對象(1)重新認識面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計模式上看,對象是...
摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣鳌1疚膶⒒貧w面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...
摘要:會造成內(nèi)存浪費的問題構(gòu)造函數(shù)繼承聲明父類聲明子類生成實例組合式繼承組合式繼承是汲取了兩者的優(yōu)點,既避免了內(nèi)存浪費,又使得每個實例化的子類互不影響。 寫在前面 既然是淺談,就不會從原理上深度分析,只是幫助我們更好地理解... 面向?qū)ο笈c面向過程 面向?qū)ο蠛兔嫦蜻^程是兩種不同的編程思想,剛開始接觸編程的時候,我們大都是從面向過程起步的,畢竟像我一樣,大家接觸的第一門計算機語言大概率都是C語...
閱讀 2008·2019-08-29 16:27
閱讀 1379·2019-08-29 16:14
閱讀 3380·2019-08-29 14:18
閱讀 3463·2019-08-29 13:56
閱讀 1261·2019-08-29 11:13
閱讀 2131·2019-08-28 18:19
閱讀 3449·2019-08-27 10:57
閱讀 2287·2019-08-26 11:39