在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ JS面向?qū)ο缶幊蹋簶?gòu)造“五節(jié)點(diǎn)原型鏈”失敗,why?

JS面向?qū)ο缶幊蹋簶?gòu)造“五節(jié)點(diǎn)原型鏈”失敗,why?

(所謂“五節(jié)點(diǎn)原型鏈”,即 n(1-實(shí)例)--N.prototype(2-第二層原型對(duì)象)--M.prototype(3-第一層原型對(duì)象)--Object.prototype(4-根構(gòu)造函數(shù)原型對(duì)象)--null(5-馕))

根據(jù)《廖雪峰javascript教程》-面向?qū)ο缶幊?原型繼承 的內(nèi)容,我在嘗試用代碼來驗(yàn)證,
很不幸,沒能成功。是不是廖老師這里的解釋有誤??

話不多說,貼代碼! ↓↓

/**
 * 想構(gòu)造一個(gè)“5節(jié)點(diǎn)原型鏈”: n(實(shí)例)--Nnn.prototype(第二層)-- Mmm.prototype(第一層)-- Object.prototype -- null
 */
//構(gòu)造函數(shù) Mmm(第一層)
function Mmm(){
    this.name = 'MMM';
    this.age = 18;
    this.do = function(){console.log("DO!!");}
}

var mmm = new Mmm();
mmm.do(); //輸出 DO!! [第一層,沒問題] 

//構(gòu)造函數(shù) Nnn(第二層) 它的原型對(duì)象是Mmm
function Nnn(){
    this.nnname = 'NNN';//僅增添一個(gè)屬性
}

//開始按照廖雪峰老師的思路(參見《廖雪峰javascript教程》面向?qū)ο缶幊?原型繼承)
/**
 * STEP1   先建立空函數(shù)F
 * STEP2   F.prototype指向第一層prototypa
 * STEP3   再把第二層prototype指向new F() 
 * STEP4   最后“修復(fù)”第二層原型對(duì)象的構(gòu)造函數(shù)屬性為第二層構(gòu)造函數(shù)本身
 * (雖然我到現(xiàn)在沒搞懂 最后為什么要“修正”。。。)
 */
function F(){}

F.prototype = Mmm.prototype;
Nnn.prototype = new F();
Nnn.prototype.constructor = Nnn;

//然鵝,并沒有什么X用。
var nnn= new Nnn();
nnn.do();//報(bào)錯(cuò)??!。。。do方法沒有繼承過來...

到底是什么原因呢?

回答
編輯回答
黑與白

你的Noo是哪里來的

F.prototype = Mmm.prototype;
Nnn.prototype = new F();
Nnn.prototype.constructor = Nnn;

你的do不是原型鏈上的方法,而是對(duì)象的屬性所有不會(huì)通過原型鏈繼承

1.修改屬性do為原型鏈上方法

Mmm.prototype.do = function () { console.log("DO!!");

2.將屬性do綁定到Nnn內(nèi)

function Nnn() {
    Mmm.call(this);//繼承屬性
    this.nnname = 'NNN';
}
2017年7月10日 16:23