我的时区早安。
我正在学习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对象作为其原型对象。 这怎么可能 ? 你能澄清我吗
提前致谢
祝你好运
答案 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
会引用该管理器,而不是写入该行的函数。