javascript - 强制 __proto__ 平等

标签 javascript oop

我希望这些实例的原型(prototype)相同,但以下相等性检查的计算结果为 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;
}

最佳答案

这两个对象具有不同原型(prototype)的原因是构造函数 EmployeeManager 在每次调用包装函数时都会再次创建。所以他们在包装函数的不同调用中调用时表示不同构造函数。

让对象方法访问私有(private)成员的常见解决方案是不在原型(prototype)上定义它们,而是在实例上定义它们。这样你就可以在构造函数范围内定义它们:

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(或 letconst)声明局部变量,否则该变量将被静默声明为全局变量变量,您将获得每个员工的相同名称。

关于javascript - 强制 __proto__ 平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42211869/

相关文章:

javascript - 为什么我们可以在闭包内部函数的末尾放置一个变量?

javascript - 使用 menuPortalTarget 时如何修复 react 选择下拉菜单的样式

javascript - AngularJS Controller 注入(inject)依赖 - 为什么构造函数有 [] ?

javascript - 删除项目后无法将其重新添加到购物篮(数组)

对象类型答案的 Java OOP 案例

java - MVC模型中的一对多关系

关于 count_if : expected primary-expression before 的 C++ 错误

javascript - Protractor - 检查输入字段是否有文本

java - 非空字符串包装器

java - 如何在多个枚举名称中重用代码?