2

在我的时区早上好。

我正在学习 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 对象作为其原型对象。这怎么可能 ?你能澄清一下吗

提前致谢

此致

4

5 回答 5

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;

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

于 2013-09-13T06:46:56.140 回答
2
function Manager(){
    this.base = Employee;
    this.base("Jack","CustpmDept");
    this.projects = [];
}

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

于 2013-09-13T06:41:58.227 回答
1

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

于 2013-09-13T06:41:23.270 回答
0

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

这有点令人困惑。

于 2013-09-13T06:42:04.740 回答
0

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

当您调用this.base()管理器的“构造函数”时,您是base从该管理器的上下文中调用该函数。因此,当我们谈到这this.name =一点时,关键字this指的是那个管理器,而不是那一行被写入的函数。

于 2013-09-13T06:44:16.830 回答