【问题标题】:Javascript constructors inheritanceJavascript 构造函数继承
【发布时间】:2013-09-17 18:02:14
【问题描述】:

在我的时区早上好。

我正在学习 JavaScript 继承,并开始阅读 MDN 页面。 我知道我们必须使用构造函数中的原型属性来构建继承链,例如:

function Employee(){
 this.name = "Dave";
 this.dept = "";
}

function Manager(){
 this.projects = [];
}
Manager.prototype = new Employee;

如果我们这样做:

var jane = new Manager();

jane.name -> 它将检索“Dave”,因为它会在 Employee 对象上找到。

我无法理解的是,如果你这样做:

 function Employee(name,dept){
 this.name = name || "Dave";
 this.dept = dept || "General";
}

function Manager(){
 this.base = Employee;
 this.base("Jack","CustpmDept");
 this.projects = [];
}

现在如果我也这样做:

var jane = new Manager();

jane.name -> 它将检索“Jack”,因为它会在 Employee 对象上找到。

在最后一个例子中,我没有使用 Manager.prototype = new Employee; 它仍然有效,Manager 对象将 Employee 对象作为其原型对象。 这怎么可能 ? 你能解释一下吗

提前致谢

最好的问候

【问题讨论】:

标签: javascript prototypal-inheritance


【解决方案1】:

查看以下代码:

function Employee(name,dept){
    this.name = name || "Dave";
    this.dept = dept || "General";
    console.log(this instanceof Manager);
}

function Manager(){
     this.base = Employee;
     this.base("Jack","CustpmDept");
     this.projects = [];
}

var jane = new Manager();
console.log(jane.name);

在示例中

console.log(this instanceof Manager);

返回 true 因为当你调用时

this.base = Employee;

您基本上是将经理的 this 发送给 Employeethis.namethis.dept 实际上是附加到 Manager 的。

【讨论】:

    【解决方案2】:

    好的,js 处理上下文的方式很有趣。

    当您在 Manager 的“构造函数”中调用 this.base() 时,您正在从该经理的上下文中调用函数 base。所以当我们到达this.name = 位时,关键字this 指的是那个管理器,而不是那个行被写入的函数。

    【讨论】:

      【解决方案3】:

      在后者中,new Manager() 返回 'Jack',因为您调用 this.Employee('Jack', 'CustpmDept')jane.name 设置为 'Jack',因为 'this' 是 'Manager',或者在这种情况下是 'jane'。

      这有点令人困惑。

      【讨论】:

        【解决方案4】:
        function Manager(){
            this.base = Employee;
            this.base("Jack","CustpmDept");
            this.projects = [];
        }
        

        当您使用this.base("Jack","CustpmDept") 时,在Employee 中使用this 调用Employee,指向新的管理器实例

        【讨论】:

          【解决方案5】:

          第二种方式类似于构造函数窃取。 this.base("Jack","CustpmDept"); 会调用Employee 构造函数,因为this 关键字会在我们新建实例时指向要创建的对象,所以jane 可以获得这些属性。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-06-26
            • 1970-01-01
            • 1970-01-01
            • 2017-02-25
            • 2014-09-02
            • 2011-12-26
            • 1970-01-01
            相关资源
            最近更新 更多