js繼承

1哈雏、原型鏈

/*
*?土浸?問題
*(1)父類中的**引用類型值會(huì)被子類共享**
*(2)不能向超類的構(gòu)造函數(shù)中傳遞參數(shù)
*/
function SuperType(){
    this.property=true;
}
SuperType.prototype.getSuperValue=function(){
    return this.property;
}
function SubType(){
    this.subProperty=false;
}
//繼承SuperType,E砀!E梢蟆愈腾!先寫
SubType.prototype=new SuperType();
//然后定義方法
SubType.prototype.getSubValue=function(){
    return this.subProperty;
}
//重寫超類中的方法
SubType.prototype.getSuperValue=function(){
    return false;
}
var instance=new SubType();
console.log(instance.getSuperValue());
function A(a){
  this.varA = a;
}

// 以上函數(shù) A 的定義中岂津,既然 A.prototype.varA 總是會(huì)被 this.varA 遮蔽,
// 那么將 varA 加入到原型(prototype)中的目的是什么橱乱?
A.prototype = {
  varA : null,  // 既然它沒有任何作用粱甫,干嘛不將 varA 從原型(prototype)去掉?
      // 也許作為一種在隱藏類中優(yōu)化分配空間的考慮危纫?
      // https://developers.google.com/speed/articles/optimizing-javascript#Initializing instance variables
      // 將會(huì)驗(yàn)證如果 varA 在每個(gè)實(shí)例不被特別初始化會(huì)是什么情況。
  doSomething : function(){
    // ...
  }
}

function B(a, b){
  A.call(this, a);
  this.varB = b;
}
B.prototype = Object.create(A.prototype, {
  varB : {
    value: null, 
    enumerable: true, 
    configurable: true, 
    writable: true 
  },
  doSomething : { 
    value: function(){ // override
      A.prototype.doSomething.apply(this, arguments); // call super
      // ...
    },
    enumerable: true,
    configurable: true, 
    writable: true
  }
});
B.prototype.constructor = B;

var b = new B();
b.doSomething();

2契耿、借用構(gòu)造函數(shù)

/*
*優(yōu)勢(shì):可以通過構(gòu)造函數(shù)向子類中傳遞參數(shù)
*螃征??問題
*(1)函數(shù)的復(fù)用無從談起
*(2)在超類中定義的原型方法在子類中是不可見的
*/
function SuperType(name){
    this.name=name;
}

function SubType(){
    SuperType.call(this,"Nick");//!!!先調(diào)用踢械,防止覆蓋子類中的屬性
    this.age=29;
}

var instance=new SubType();
console.log(instance.age);
console.log(instance.name);

3魄藕、組合繼承

/*
* ******最常用方式******
*缺點(diǎn):調(diào)用兩次構(gòu)造函數(shù)
*/
function SuperType(name){
    this.name=name;
    this.colors=["red","blue","black"];
}
SuperType.prototype.sayName=function(){
    console.log(this.name);
}

function SubType(name,age){
    //繼承屬性背率,必須先寫,方式被覆蓋
    SuperType.call(this,name);//第二次調(diào)用
    this.age=age;
}
//繼承SuperType,M松;嵊汀!翻翩!先寫
SubType.prototype=new SuperType();//第一次調(diào)用
SubType.prototype.constructor=SubType;
SubType.prototype.sayAge=function(){
    console.log(this.age);
}

var instance1=new SubType("Nick",24);
instance1.colors.push("heh");
console.log(instance1.colors);
instance1.sayAge();
instance1.sayName();

var instance2=new SubType("xiaoming",33);
console.log(instance2.colors);
instance2.sayAge();
instance2.sayName();

4嫂冻、原型繼承

/*
*目的:基于已有對(duì)象創(chuàng)建新對(duì)象,同時(shí)還不必因此創(chuàng)建自定義類型
*優(yōu)點(diǎn):不用創(chuàng)建構(gòu)造函數(shù)
*缺點(diǎn):會(huì)共享相應(yīng)的值
*
*/
function object(o){
    function F(){}
    F.prototype=o;
    return new F();
}

var Person={
    name:"Nick",
    friends:["gic","fd","fff"]

};
//var anotherPerson=object(Person);
//*****!!!!等價(jià)于 
var anotherPerson=Object.create(Person,{
    name:{
        writable:true,
        value:"Grey"
    }
});
anotherPerson.name="Grey";
anotherPerson.friends.push("Bob");

var yetanotherPerson=object(Person);
yetanotherPerson.name="Linda";//不會(huì)修改父類的值睛低,會(huì)重新生成一個(gè)name屬性
anotherPerson.name="ff";
console.log(yetanotherPerson.name);//Linda
console.log(Person.friends);

5服傍、寄生式繼承

/*
*缺點(diǎn):函數(shù)不能復(fù)用降低效率
*主要考慮對(duì)象而不是構(gòu)造函數(shù)的情況下適用
*/
function object(o){
    function F(){}
    F.prototype=o;
    return new F();
}
function createAnother(original){
    var clone=object(original);
    clone.syaHi=function(){
        console.log("hi");
    };
    return clone;
}
var person={
    name:"Nick",
    friends:["gic","fd","fff"]

};
var anotherPerson=createAnother(person);
anotherPerson.syaHi();

3吹零、寄生組合繼承

/*
* 解決了組合繼承兩次調(diào)用構(gòu)造函數(shù)問題
*/
function object(o){
    function F(){}
    F.prototype=o;
    return new F();
}
function inheritPrototype(subType,superType){
    var prototype=object(superType.prototype);//創(chuàng)建對(duì)象
    prototype.constructor=subType;//增強(qiáng)對(duì)象
    subType.prototype=prototype;//指定對(duì)象
}
function SuperType(name){
    this.name=name;
    this.colors=["red","blue","black"];
}
SuperType.prototype.sayName=function(){
    console.log(this.name);
}
inheritPrototype(SubType,SuperType);
function SubType(name,age){
    //繼承屬性,必須先寫套蒂,方式被覆蓋
    SuperType.call(this,name);//第二次調(diào)用
    this.age=age;
}

SubType.prototype.sayAge=function(){
    console.log(this.age);
}

var instance1=new SubType("Nick",24);
instance1.colors.push("heh");
console.log(instance1.colors);
instance1.sayAge();
instance1.sayName();

var instance2=new SubType("xiaoming",33);
console.log(instance2.colors);
instance2.sayAge();
instance2.sayName();

proto

1.所有構(gòu)造器/函數(shù)的__proto__都指向Function.prototype,
 (1) 它是一個(gè)空函數(shù)(Empty function)
Number.__proto__ === Function.prototype  // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype  // true
Object.__proto__ === Function.prototype  // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype   // true
RegExp.__proto__ === Function.prototype  // true
Error.__proto__ === Function.prototype   // true
Date.__proto__ === Function.prototype    // true

包括自定的
// 函數(shù)聲明
function Person() {}
// 函數(shù)表達(dá)式
var Man = function() {}
console.log(Person.__proto__ === Function.prototype) // true
console.log(Man.__proto__ === Function.prototype)    // true
    js的解析器對(duì)函數(shù)聲明與函數(shù)表達(dá)式并不是一視同仁地對(duì)待的伸辟。
    對(duì)于函數(shù)聲明馍刮,js解析器會(huì)優(yōu)先讀取,確保在所有代碼執(zhí)行之前
    聲明已經(jīng)被解析静稻,而函數(shù)表達(dá)式匈辱,如同定義其它基本類型的變量
    一樣,只在執(zhí)行到某一句時(shí)也會(huì)對(duì)其進(jìn)行解析押搪,所以在實(shí)際中浅碾,
    它們還是會(huì)有差異的,具體表現(xiàn)在厦画,當(dāng)使用函數(shù)聲明的形式來定義函數(shù)時(shí)滥朱,
    可將調(diào)用語句寫在函數(shù)聲明之前,而后者排嫌,這樣做的話會(huì)報(bào)錯(cuò)缰犁。
(2)Math,JSON是以對(duì)象形式存在的薇芝,無需new丰嘉。它們的__proto__是
Object.prototype嚷缭。
Math.__proto__ === Object.prototype  // true
JSON.__proto__ === Object.prototype  // true

(3)Function.prototype也是唯一一個(gè)typeof XXX.prototype為“function”
     的prototype耍贾。其它的構(gòu)造器的prototype都是一個(gè)對(duì)象路幸。如下
    console.log(typeof Function.prototype) // function
    console.log(typeof Object.prototype)   // object
    console.log(typeof Number.prototype)   // object
    console.log(typeof Boolean.prototype)  // object
    console.log(typeof String.prototype)   // object
    console.log(typeof Array.prototype)    // object
    console.log(typeof RegExp.prototype)   // object
    console.log(typeof Error.prototype)    // object
    console.log(typeof Date.prototype)     // object
    console.log(typeof Object.prototype)   // object

2.所有對(duì)象的__proto__都指向其構(gòu)造器的prototype
p.__proto__ === Person.prototype===p.constructor.prototype

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末简肴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子能扒,更是在濱河造成了極大的恐慌辫狼,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件见秤,死亡現(xiàn)場(chǎng)離奇詭異真椿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挣跋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門避咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來修噪,“玉大人,你說我怎么就攤上這事黄琼≡嗫睿” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵剂府,是天一觀的道長(zhǎng)剃盾。 經(jīng)常有香客問我淤袜,道長(zhǎng)衰伯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任烦周,我火速辦了婚禮怎顾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贪壳。我一直安慰自己蚜退,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布蚂且。 她就那樣靜靜地躺著幅恋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捆交。 梳的紋絲不亂的頭發(fā)上淑翼,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音品追,去河邊找鬼玄括。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肉瓦,可吹牛的內(nèi)容都是我干的遭京。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼泞莉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼哪雕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鲫趁,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饮寞,沒想到半個(gè)月后孝扛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體列吼,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幽崩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年苦始,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慌申。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陌选,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹄溉,到底是詐尸還是另有隱情咨油,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布柒爵,位于F島的核電站役电,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棉胀。R本人自食惡果不足惜法瑟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唁奢。 院中可真熱鬧霎挟,春花似錦、人聲如沸麻掸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脊奋。三九已至熬北,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诚隙,已是汗流浹背讶隐。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最楷,地道東北人整份。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像籽孙,于是被迫代替她去往敵國(guó)和親烈评。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接 js的繼承有6種方式犯建,大致總結(jié)一下它們各自的優(yōu)缺點(diǎn)讲冠,以及它們之間的關(guān)系。 1.原型鏈 js的繼承機(jī)制不同...
    空_城__閱讀 796評(píng)論 0 11
  • 昨天晚上谱仪,按照慣例,翻著雜志消磨睡前時(shí)間否彩,看到了一則故事疯攒,想要分享給各位聽友。 故事講的是一位風(fēng)光了50年的話劇演...
    c7b6666e4189閱讀 1,378評(píng)論 0 0
  • 主要介紹中國(guó)人向中國(guó)專利局提交發(fā)明專利申請(qǐng)時(shí)列荔,所需要提交和注意的事項(xiàng) 中國(guó)發(fā)明專利的審查程序流程圖: 注:圖片轉(zhuǎn)自...
    盼著晴天的小懶蟲閱讀 747評(píng)論 0 0
  • 也不知是不是最近在看聊齋的緣故敬尺,昨晚做了春夢(mèng)。也不能說是春夢(mèng)吧贴浙,只是夢(mèng)到和兩個(gè)女人做愛砂吞,但是一點(diǎn)激動(dòng)的心情都沒有。...
    Hushering閱讀 238評(píng)論 0 0
  • 軀干作為身體中占面積最多的部位,它是眾多器官的載體袁串,它的很多行為都可以反映人們的秘密概而,很多行為都是為了保護(hù)自己。 ...
    陌靄閱讀 476評(píng)論 0 0