我希望这些实例的原型相同,但以下等式检查的计算结果为false.
var emp1 = new(EmployeeScope())("John");
var emp2 = new(EmployeeScope())("Amit");
var mgr1 = new(ManagerScope())("Robert", "Data");
var mgr2 = new(ManagerScope())("Alex", "Science");
emp1.getName() // John
emp2.getName() // Amit
mgr1.getDept() // Data
mgr2.getDept() // Science
mgr1.getName() // Robert
mgr2.getName() // Alex
emp1.__proto__ === emp2.__proto__ //false
mgr1.__proto__ === mgr2.__proto__ //false
function EmployeeScope() {
var name;
function Employee(newName) {
name = newName;
}
Employee.prototype.getName = function() {
return name
};
Employee.prototype.setName = function(newName) {
name = newName
};
return Employee;
}
function ManagerScope() {
var Employee = EmployeeScope();
var dept;
function Manager(newName, newDept) {
new Employee(newName);
dept = newDept;
}
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.getDept = function() {
return dept
};
Manager.prototype.setDept = function(newDept) {
dept = newDept
};
return Manager;
}
最佳答案 两个对象具有不同原型的原因是构造函数Employee和Manager在每次调用包装函数时再次创建.因此,它们在包装函数的不同调用中调用时表示不同的构造函数.
让对象方法访问私有成员的常见解决方案是,不是在原型上定义它们,而是在实例上定义它们.这样您就可以在构造函数范围中定义它们:
function Employee(newName) {
var name = newName;
this.getName = function() {
return name
};
this.setName = function(newName) {
name = newName
};
}
function Manager(newName, newDept) {
var dept = newDept;
// Inherit from Employee
Employee.call(this, newName);
this.getDept = function() {
return dept
};
this.setDept = function(newDept) {
dept = newDept
};
}
var emp1 = new Employee("John");
var emp2 = new Employee("Amit");
var mgr1 = new Manager("Robert", "Data");
var mgr2 = new Manager("Alex", "Science");
console.log(emp1.getName()) // John
console.log(emp2.getName()) // Amit
console.log(mgr1.getDept()) // Data
console.log(mgr2.getDept()) // Science
console.log(mgr1.getName()) // Robert
console.log(mgr2.getName()) // Alex
console.log(Object.getPrototypeOf(emp1) === Object.getPrototypeOf(emp2));
console.log(Object.getPrototypeOf(mgr1) === Object.getPrototypeOf(mgr2));
请注意,建议使用Object.getPrototypeOf()
而不是__proto__.
其次,您应该使用var(或let,const)声明局部变量,否则该变量将被静默声明为全局变量,并且您将为每个员工获得相同的名称.