成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

面向?qū)ο?非構(gòu)造函數(shù)的繼承

zhangke3016 / 2207人閱讀

摘要:這兩個都是用字面量方法創(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

相關(guān)文章

  • Javascript面向對象編程(三):構(gòu)造函數(shù)繼承

    摘要:原文鏈接一什么是非構(gòu)造函數(shù)的繼承比如,現(xiàn)在有一個對象,叫做中國人。通過函數(shù),繼承了。中國北京上海香港廈門北京上海香港廈門北京上海香港這時,父對象就不會受到影響了。目前,庫使用的就是這種繼承方法。 原文鏈接 一、什么是非構(gòu)造函數(shù)的繼承? 比如,現(xiàn)在有一個對象,叫做中國人。 var Chinese = { nation: 中國 } 還有一個對象,叫做醫(yī)生。 var Doctor = {...

    jaysun 評論0 收藏0
  • JS對象(1)重新認識面向對象

    摘要:對象重新認識面向?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è)計模式上看,對象是...

    superw 評論0 收藏0
  • PHP面向對象

    摘要:面向?qū)ο竺嫦驅(qū)ο蠡A(chǔ)面向?qū)ο笫裁词穷惥哂邢嗤瑢傩蕴卣骱头椒ㄐ袨榈囊幌盗袀€體的集合,類是一個抽象的概念。析構(gòu)函數(shù),當(dāng)一個對象被銷毀前,自動調(diào)用。作用是為新克隆的對象進行初始化賦值對象序列化時,自動調(diào)用。使用抽象類的作用限制實例化。 面向?qū)ο?面向?qū)ο蠡A(chǔ) 面向?qū)ο?什么是類? 具有相同屬性(特征)和方法(行為)的一系列個體的集合,類是一個抽象的概念。 什么是對象? 從類中,拿到的具有具體...

    seanlook 評論0 收藏0
  • 面向對象 JavaScript

    摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣鳌1疚膶⒒貧w面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...

    novo 評論0 收藏0
  • 淺談JavaScript面向對象和它封裝、繼承、多態(tài)

    摘要:會造成內(nèi)存浪費的問題構(gòu)造函數(shù)繼承聲明父類聲明子類生成實例組合式繼承組合式繼承是汲取了兩者的優(yōu)點,既避免了內(nèi)存浪費,又使得每個實例化的子類互不影響。 寫在前面 既然是淺談,就不會從原理上深度分析,只是幫助我們更好地理解... 面向?qū)ο笈c面向過程 面向?qū)ο蠛兔嫦蜻^程是兩種不同的編程思想,剛開始接觸編程的時候,我們大都是從面向過程起步的,畢竟像我一樣,大家接觸的第一門計算機語言大概率都是C語...

    MAX_zuo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<