Javascript构造函数继承

时间:2013-09-13 06:34:25

标签: javascript prototypal-inheritance

我的时区早安。

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

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; 并且stil工作,Manager对象将Employee对象作为其原型对象。 这怎么可能 ? 你能澄清我吗

提前致谢

祝你好运

5 个答案:

答案 0 :(得分:3)

查看以下代码:

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.name this.dept 实际上已附加到经理

答案 1 :(得分:2)

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

当您使用this.base("Jack","CustpmDept")时,在Employee内调用this Employee指向新经理实例

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在后者中,new Manager()会返回“杰克”,因为您拨打this.Employee('Jack', 'CustpmDept')jane.name设置为“杰克”,因为“此”是“经理”,或者在这种情况下, '简

这有点令人困惑。

答案 4 :(得分:0)

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

当您在Managers'构造函数中调用this.base()时,您正在从该管理器的上下文中调用函数base。所以当我们到达this.name =位时,关键字this会引用该管理器,而不是写入该行的函数。