鍍金池/ 問答/HTML/ JS面向對象編程:構造“五節(jié)點原型鏈”失敗,why?

JS面向對象編程:構造“五節(jié)點原型鏈”失敗,why?

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

根據《廖雪峰javascript教程》-面向對象編程-原型繼承 的內容,我在嘗試用代碼來驗證,
很不幸,沒能成功。是不是廖老師這里的解釋有誤??

話不多說,貼代碼! ↓↓

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

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

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

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

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

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

到底是什么原因呢?

回答
編輯回答
黑與白

你的Noo是哪里來的

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

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

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

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

2.將屬性do綁定到Nnn

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