1

我对javascript继承感到困惑。

考虑以下代码:

function parent(firstname, lastname) {
    this.firstname = firstname || "abc";
    this.lastname = lastname || "def";
}

function child() {
   this.childname = "xys";
}
parent.prototype.Greetings = function () {
    alert("sayhi");
}
child.prototype = Object.create(parent.prototype);
var child1 = new child();

现在,该child1对象是否可以访问firstnamelastname属性?我可以访问该Greetings方法(因为它在原型中)。如果我尝试访问这些,它会显示为undefined. 必须进行哪些更改才能访问这些变量?

4

2 回答 2

1

必须进行哪些更改才能访问这些变量?

您必须在子构造函数中调用父构造函数:

function child() {
  parent.call(this);
  this.childname = "xys";
}

与其他语言(至少在 ES6 类之前)相比,JavaScript“继承”没有那么神奇(即隐式)。

在您的示例中,您有一个函数parentthis. 但是,您的代码中没有任何地方调用parent,因此永远不会设置这些属性。

为了设置它们,我们需要应用parent到新child实例,这是通过调用来完成的parent.call(this);

由于parent接受参数,您可能希望最终通过它们child

function child(firstname, lastname) {
  parent.call(this, firstname, lastname);
  this.childname = "xys";
}

相关:使用 `Object.create` 进行继承的好处

于 2016-09-09T18:31:40.007 回答
0

更好的方法是使用更新的 ES2015 标准。语法更清晰易懂。执行以下操作:

class Parent {
    constructor(firstname, lastname) {
        this.firstname = firstname || "abc";
        this.lastname = lastname || "def";
    }
    greetings() {
        alert("sayhi");
    }
}

class Child extends Parent {
    constructor(){
        super(firstname, lastname);
        this.childname = "xys";
    }
}
var child1 = new child();

有关 ES2015 的信息可以在https://babeljs.io/docs/learn-es2015/找到。此外,可以在此处找到有关 javascript 中的类声明的更多细节:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes 。

于 2016-09-09T18:41:15.573 回答