节点打印' undefined'对于Shell

时间:2015-09-03 23:50:58

标签: javascript node.js inheritance output prototypal-inheritance

我一直在谷歌上搜索,为了我的生活,我似乎找不到满意的答案。我意识到我要么对Node做错了,要么完全不知道原型继承是如何工作的,但对我而言,这只是让我疯狂而不知道为什么,所以我很感激任何反馈,以帮助我理解我和# 39;我做错了。

我有三节课。这些类可以做任何事情,但为了讨论起见,它们会有名称。

  • Mammal.js
  • Human.js
  • test.js

Mammal是基类,Human是子类,test是执行代码的类。现在,我知道有多种方法可以扩展另一个对象。是否通过使用Object.create()或构造函数配置。在这个例子中,我使用构造函数来创建新对象,我将子类的原型直接指向它继承的对象。因此,默认情况下,子类必须将原型链上升到它继承的对象,如果它无法在子类中找到该方法。

现在,当我这样做时,它有效......排序?我可以调用其中一个函数,它就像被覆盖一样,但当我尝试通过节点中的console.log()检查对象,原型或任何信息时,我几乎得不到任何东西。这对我来说非常混乱,我很乐意帮助澄清为什么会这样。

以下是我使用的课程和输出。

Mammal.js

module.exports = (function() {
    function Mammal() {
        // do nothing
    }

    Mammal.prototype = {};

    Mammal.prototype.initialize = function initialize() {
        throw Error(this.type() + ' has extended the "Mammal" class without overriding the "type" function. Please assign this function correctly in the new sub-class.');
    };
    Mammal.prototype.speak = function speak() {
        // Mammal.speak.call(this);
        console.log('I am a ' + this.type() + '.');
    };
    Mammal.prototype.type = function type() {
        throw Error('A sub-object has extended the "Mammal" class without overriding the "type" function. Please assign this function correctly in the new sub-class.');
    };
    Mammal.prototype.printDebug = function printDebug() {
        console.log(this.type() + " prototype: " + this.prototype);
    };

    return Mammal;
})();

Human.js

var Mammal = require('./Mammal');

module.exports = (function() {
    function Human() {
        // Call to super
        Mammal.constructor.call(this);
    };

    Human.prototype = new Mammal();

    Human.prototype.initialize = function initialize() {
        // do something
    };
    Human.prototype.type = function type() {
        return "Human";
    };

    return Human;
})();

test.js

var Human = require('./Human');
var human = new Human();
console.log("------------------------")
console.log("Object Inspection")
console.log("------------------------")
console.log(human);
console.log("------------------------")
console.log("Prototype Inspection")
console.log("------------------------")
console.log(human.prototype);
console.log("------------------------")
console.log("Stringify Inspection")
console.log("------------------------")
console.log(JSON.stringify(human.prototype));
console.log("------------------------")
console.log("Object printDebug")
console.log("------------------------")
human.printDebug();
console.log("------------------------")
console.log("Object printDebug")
console.log("------------------------")
console.log(human.type());
console.log("------------------------")
console.log("Speak")
console.log("------------------------")
human.speak();

输出

------------------------
Object Inspection
------------------------
{}
------------------------
Prototype Inspection
------------------------
undefined
------------------------
Stringify Inspection
------------------------
undefined
------------------------
Object printDebug
------------------------
Human prototype: undefined
------------------------
Object printDebug
------------------------
Human
------------------------
Speak
------------------------
I am a Human.

我的期望是人类原型会指向某种东西。特别是声明的Mammal对象。除了它不是将人类对象作为一组空括号输出之外,当它真正具有来自哺乳动物类的方法时,它会延伸"从。它不会显示原型参考吗?很明显,它的原型链中有一些方法,因为它执行speak命令没有任何问题。

那么我在这里误解了什么?

1 个答案:

答案 0 :(得分:0)

阿。有人为我澄清了这个问题。我将human.prototype属性与对象的_ prototype _属性混淆。后者是当它无法在当前对象中找到方法时将被遍历的引用。因此,为什么它返回undefined是有道理的。因为human.prototype与human._ prototype _完全分开。建议的解决方案也是使用Object.getPrototypeOf(object),除了在旧的Opera浏览器中工作,MDN所说的。所以,抬头!