我一直在谷歌上搜索,为了我的生活,我似乎找不到满意的答案。我意识到我要么对Node做错了,要么完全不知道原型继承是如何工作的,但对我而言,这只是让我疯狂而不知道为什么,所以我很感激任何反馈,以帮助我理解我和# 39;我做错了。
我有三节课。这些类可以做任何事情,但为了讨论起见,它们会有名称。
Mammal是基类,Human是子类,test是执行代码的类。现在,我知道有多种方法可以扩展另一个对象。是否通过使用Object.create()或构造函数配置。在这个例子中,我使用构造函数来创建新对象,我将子类的原型直接指向它继承的对象。因此,默认情况下,子类必须将原型链上升到它继承的对象,如果它无法在子类中找到该方法。
现在,当我这样做时,它有效......排序?我可以调用其中一个函数,它就像被覆盖一样,但当我尝试通过节点中的console.log()检查对象,原型或任何信息时,我几乎得不到任何东西。这对我来说非常混乱,我很乐意帮助澄清为什么会这样。
以下是我使用的课程和输出。
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;
})();
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;
})();
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命令没有任何问题。
那么我在这里误解了什么?
答案 0 :(得分:0)
阿。有人为我澄清了这个问题。我将human.prototype属性与对象的_ prototype _属性混淆。后者是当它无法在当前对象中找到方法时将被遍历的引用。因此,为什么它返回undefined是有道理的。因为human.prototype与human._ prototype _完全分开。建议的解决方案也是使用Object.getPrototypeOf(object),除了在旧的Opera浏览器中工作,MDN所说的。所以,抬头!