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

資訊專欄INFORMATION COLUMN

Javascript面向?qū)ο缶幊蹋ㄈ悍菢?gòu)造函數(shù)的繼承

jaysun / 1991人閱讀

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

原文鏈接

一、什么是"非構(gòu)造函數(shù)"的繼承?

比如,現(xiàn)在有一個對象,叫做"中國人"。

var Chinese = {
  nation: "中國"
}

還有一個對象,叫做"醫(yī)生"。

var Doctor = {
  career: "醫(yī)生"
}

請問怎樣才能讓"醫(yī)生"去繼承"中國人",也就是說,我怎樣才能生成一個"中國醫(yī)生"的對象?

這里要注意,這兩個對象都是普通對象,不是構(gòu)造函數(shù),無法使用構(gòu)造函數(shù)方法實現(xiàn)"繼承"。

二、object()方法

json格式的發(fā)明人Douglas Crockford,提出了一個object()函數(shù),可以做到這一點。

function object(o) {
  function F() {}
  F.prototype = o;
  return new F();
}
var Doctor = object(Chinese)
Doctor.career = "醫(yī)生"
console.log(Doctor.nation) // "中國"

這個object()函數(shù),其實只做一件事,就是把子對象的prototype屬性,指向父對象,從而使得子對象與父對象連在一起。

三、淺拷貝

除了使用原型鏈以外,還有另一種思路:把父對象的屬性,全部拷貝給子對象,也能實現(xiàn)繼承。

下面這個函數(shù),就是在做拷貝:

function extendCopy(p) {
  var c = {};
  for(var i in p) {
    c[i] = p[i]
  }
  return c;
}
var Doctor = extendCopy(Chinese)
Doctor.career = "醫(yī)生"
console.log(Doctor.nation) // "中國"

但是,這樣的拷貝有一個問題。那就是,如果父對象的屬性等于數(shù)組或另一個對象,那么實際上,子對象獲得的只是一個內(nèi)存地址,而不是真正拷貝,因此存在父對象被篡改的可能。

現(xiàn)在給Chinese添加一個"出生地"屬性,它的值是一個數(shù)組。

通過extendCopy()函數(shù),Doctor繼承了Chinese。

然后,我們?yōu)镈octor的"出生地"添加一個城市。

我們會發(fā)現(xiàn)Chinese的"出生地"也被改掉了。

Chinese.birthPlaces = ["北京","上海","香港"];
var Doctor = extendCopy(Chinese);
Doctor.birthPlaces.push("廈門");
alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門
alert(Chinese.birthPlaces); //北京, 上海, 香港, 廈門

所以,extendCopy()只是拷貝基本類型的數(shù)據(jù),我們把這種拷貝叫做"淺拷貝"。這是早期jQuery實現(xiàn)繼承的方式。

四、深拷貝

所謂"深拷貝",就是能夠?qū)崿F(xiàn)真正意義上的數(shù)組和對象的拷貝。它的實現(xiàn)并不難,只要遞歸調(diào)用"淺拷貝"就行了。

var Chinese = {
  nation: "中國"
}
Chinese.birthPlaces = ["北京","上海","香港"];

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);
Doctor.birthPlaces.push("廈門");

console.log(Doctor.birthPlaces); // ["北京", "上海", "香港", "廈門"]
console.log(Chinese.birthPlaces); // ["北京", "上海", "香港"]

這時,父對象就不會受到影響了。

目前,jQuery庫使用的就是這種繼承方法。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81839.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    AaronYuan 評論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
  • JavaScript面向對象編程-繼承

    摘要:子類不是父類實例的問題是由類式繼承引起的。所以寄生式繼承和構(gòu)造函數(shù)繼承的組合又稱為一種新的繼承方式。但是這里的寄生式繼承處理的不是對象,而是類的原型??瓷先ヂ晕?fù)雜,還得好好研究。 寄生組合式繼承(終極繼承者) 前面學(xué)習(xí)了類式繼承和構(gòu)造函數(shù)繼承組合使用,也就是組合繼承,但是這種繼承方式有個問題,就是子類不是父類的實例,而子類的原型是父類的實例。子類不是父類實例的問題是由類式繼承引起的。...

    alaege 評論0 收藏0

發(fā)表評論

0條評論

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