理解原型继承javascript
这是对这个问题的一种跟进: 但我用错了措辞,让它看起来像是我想要JavaScript中的经典继承,而我只是想弄清楚如何与Python类似地实现它 这是我到目前为止所拥有的,但它没有像我希望的那样工作理解原型继承javascript,javascript,node.js,inheritance,Javascript,Node.js,Inheritance,这是对这个问题的一种跟进: 但我用错了措辞,让它看起来像是我想要JavaScript中的经典继承,而我只是想弄清楚如何与Python类似地实现它 这是我到目前为止所拥有的,但它没有像我希望的那样工作 var util = require("util") function FirstClass() { this.name = "First Class"; } FirstClass.prototype.sayName = function(){ this.callFunction
var util = require("util")
function FirstClass() {
this.name = "First Class";
}
FirstClass.prototype.sayName = function(){
this.callFunction("some_function", "hello")
}
FirstClass.prototype.callFunction = function(){
var func = arguments[0];
var args = Array.prototype.slice.call(arguments).slice(1, arguments.length)
if (this[func] !== undefined){
this[func].apply(null, args);
}
}
function SubClass(){}
util.inherits(SubClass, FirstClass)
SubClass.prototype.some_function = function(msg){
console.log(msg, this.name) // "hello undefined"
}
var sub_class = new SubClass();
sub_class.sayName();
当我尝试sub_class.sayName()
时,它会正确调用并继承sayName
正确,但当我尝试使用this
关键字显示名称时,它不起作用,并在“hello”旁边打印undefined
,那么我该如何修复它,使其显示“hello FirstClass”
我认为它拥有FirstClass继承的所有变量和对象,但它没有。这就是原型遗传的工作原理吗?如果是这样的话,是否有任何方法可以查看/更改子类中的父变量
我曾尝试查找JavaScript的原型继承来解决这个问题,但由于我习惯了经典继承,所以我还没有完全掌握这个概念。有人知道如何从父类继承并从子类更改其变量吗
另外,如果有人有一个好的链接可以查看,这样我就可以更好地理解原型继承,以备将来参考,那就太好了。您的问题在于:
this[func].apply(null,args)代码>
它应该是:this[func].apply(this,args)代码>您缺少此部分:
function SubClass(){
FirstClass.apply(this);
}
这相当于传统类继承中的超级调用。下面是一个如何继承和扩展类的简化示例。我强烈建议检查如何使用继承创建类的更好示例
现在,由于我不熟悉util
应该做什么,这个示例演示了如何使用本机JS而不使用帮助程序实现结果:
请点击此处:
我也想知道这个问题的答案。我用过原型,只是还没有用过继承。@Grimbode:当你用原型时,你就是在做继承。@cookie monster,那么继承()有什么用呢?它只是一个帮助函数,当一个函数的原型对象从另一个函数继承时,它会抽象出一些样板代码。但不管你如何设置原型链,当你向一个用作另一个原型的对象添加成员时,另一个对象继承了该属性。我刚刚更改了它,它仍然打印未定义。我意识到Edwin的答案是有效的,因为我将null改为该值,所以这有助于解决我的问题谢谢。耶,我很高兴能帮助你!谢谢你提到这件事。谢谢你,这件事成功了。我很惊讶我没有更早地发现这一点,这似乎很简单。@user3234209:这只是问题的一部分。另一个答案中的null
问题也需要解决。不过,这种方法可能无法在FirstClass
@user3234209中定义任何不可枚举的属性:实际上,您不希望这样做。它打破了首先使用原型继承的观点,即您根本不需要为(父项中的var attr){
使用for,并且对FirstClass.prototype.prototype所做的更改在子类
对象上看不到。util.inherits
大部分可以用两行短代码替换。
function FirstClass() {
this.name = "First Class";
}
FirstClass.prototype.sayName = function () {
this.callFunction("some_function", "hello")
}
FirstClass.prototype.callFunction = function () {
var func = arguments[0];
var args = Array.prototype.slice.call(arguments).slice(1, arguments.length)
if (this[func] !== undefined) {
this[func].apply(this, args);
}
}
function SubClass() {
var parent = new FirstClass();
// this is lightweight example of an "extend" method
for(var attr in parent) {
// if this subclass has not over-written an attr,
// copy the attributes of FirstClass to SubClass
if(!this[attr]) {
this[attr] = parent[attr];
}
}
return this;
}
SubClass.prototype.some_function = function (msg) {
console.log(msg, this.name);
}
var sub_class = new SubClass();
sub_class.sayName();