JS面向对象编程:构造“五节点原型链”失败,why?

(所谓“五节点原型链”,即 n(1-实例)--N.prototype(2-第二层原型对象)--M.prototype(3-第一层原型对象)--Object.prototype(4-根构造函数原型对象)--null(5-馕))

根据《廖雪峰javascript教程》-面向对象编程-原型继承 的内容,我在尝试用代码来验证,
很不幸,没能成功。是不是廖老师这里的解释有误??

话不多说,贴代码! ↓↓

/**
 * 想构造一个“5节点原型链”: 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方法没有继承过来...

到底是什么原因呢?

阅读 1.9k
1 个回答

你的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';
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题