关于JavaScript原型prototype使用的一个疑问

100Continue 2012-11-04
prototype可以使Employee调用Person里面的getName的方法。但是 在getName里面的this,却不是Employee。 而是跳出来所有的if else,走到了最后的那个alert("nothing");并return。 很好奇,this为什么不能去其他的对象类型匹配上呢? 代码如下:
function Person(name, sex) {
  this.name = name;
  this.sex = sex;
}
Person.prototype = {
  getName:function(){
  if(this === Employee)
  {alert("Employee")
  return this.name;
  }
  else if(this === Person)
  {alert("Person")
  return this.name;
  }
  else if(this === window)
  {alert("windows")
  return this.name;
  }
  else if(this === Object)
  {
  alert("object")
  return this.name;
  }
  alert("nothing");
  return this.name;
  }
}
function Employee(name, sex, employeeID) {
  this.name = name;
  this.sex = sex;
  this.employeeID = employeeID;
  }
// 将Employee的原型指向Person的一个实例
// 因为Person的实例可以调用Person原型中的方法, 所以Employee的实例也可以调用Person原型中的所有属性。
Employee.prototype = new Person('vf');
Employee.prototype.getEmployeeID = function() {
  return this.employeeID;
};
var zhang = new Employee("ZhangSan", "man", "1234");
alert(zhang.getName()); // "ZhangSan
shatuo 2012-11-04
在chrome将这个变量打出来你会发现是不一样的
getName:function(){
  console.log(this);
  console.log(Employee);

得到的结果是
Employee {sex: "man", employeeID: "1234", name: "ZhangSan"}
function Employee(name, sex, employeeID) {
  this.name = name;
  this.sex = sex;
  this.employeeID = employeeID;
  }


this === Employee
全等操作符得到的结果肯定是false

判断是不是实例应该用instanceof
改成这样  if(this instanceof  Employee)
就能达到你的目的了。
100Continue 2012-11-05
多谢,你的解释很棒。谢谢
905766491 2012-11-11
这个应该属于面向对象的。不能用等号.
ricoyu 2013-03-30
首先this是一个对象的实例, 而Employee是它的构造函数, 所以this === Employee肯定等于false, 当然, this == Employee 也是false。因为两者不是一个东西。
Global site tag (gtag.js) - Google Analytics