Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解原型继承javascript_Javascript_Node.js_Inheritance - Fatal编程技术网

理解原型继承javascript

理解原型继承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

这是对这个问题的一种跟进:

但我用错了措辞,让它看起来像是我想要JavaScript中的经典继承,而我只是想弄清楚如何与Python类似地实现它

这是我到目前为止所拥有的,但它没有像我希望的那样工作

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();