Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 强制原等式_Javascript_Oop - Fatal编程技术网

Javascript 强制原等式

Javascript 强制原等式,javascript,oop,Javascript,Oop,我希望这些实例的原型是相同的,但是下面的等式检查的结果是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.getNa

我希望这些实例的原型是相同的,但是下面的等式检查的结果是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


这两个对象具有不同原型的原因是,构造函数
Employee
Manager
在每次调用放入它们的包装函数时都会再次创建。所以,当在包装函数的不同调用中调用时,它们代表不同的构造函数

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

职能员工(新名称){
var name=newName;
this.getName=函数(){
返回名称
};
this.setName=函数(newName){
name=新名称
};
}
职能经理(新名称、新部门){
var dept=newDept;
//承继
Employee.call(this,newName);
this.getDept=函数(){
退货部
};
this.setDept=函数(newDept){
dept=newDept
};
}
var emp1=新员工(“约翰”);
var emp2=新员工(“Amit”);
var mgr1=新经理(“罗伯特”,“数据”);
var mgr2=新经理(“Alex”,“科学”);
console.log(emp1.getName())//John
console.log(emp2.getName())//Amit
console.log(mgr1.getDept())//数据
console.log(mgr2.getDept())//Science
console.log(mgr1.getName())//Robert
console.log(mgr2.getName())//Alex
log(Object.getPrototypeOf(emp1)==Object.getPrototypeOf(emp2));

log(Object.getPrototypeOf(mgr1)==Object.getPrototypeOf(mgr2))当您编写以下代码时,可能更容易理解为什么它们不共享相同的原型:

var EmployeeA = EmployeeScope();
var EmployeeB = EmployeeScope();
EmployeeA === EmployeeB // false
EmployeeA.prototype === EmployeeB.prototype // false
var emp1 = new EmployeeA("John");
var emp2 = new EmployeeB("Amit");
Object.getPrototypeOf(emp1) === EmployeeA.prototype // true
Object.getPrototypeOf(emp2) === EmployeeB.prototype // true
让您的
EmployeeScope
在每次新调用时创建一个新类(构造函数+原型)并不是最好的主意。此外,如果
name
是静态存储的,则只能将其用于单个实例:

var emp3 = new EmployeeB("Dirk");
Object.getPrototypeOf(emp2) === Object.getPrototypeOf(emp3) // true
emp2.getName() // Dirk - oops
当然,你的
经理
班也有同样的问题。因此,放弃那些“范围”函数,让它们成为标准类:

function Employee(newName) {
  this.name = newName;
}
Employee.prototype.getName = function() {
  return this.name
};
Employee.prototype.setName = function(newName) {
  this.name = newName
};


function Manager(newName, newDept) {
  Employee.call(this, newName);
  this.dept = newDept;
}
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.getDept = function() {
  return this.dept
};
Manager.prototype.setDept = function(newDept) {
  this.dept = newDept
};

var emp1 = new Employee("John");
var emp2 = new Employee("Amit");
var emp3 = new Employee("Dirk");
var mgr1 = new Manager("Robert", "Data");
var mgr2 = new Manager("Alex", "Science");
Object.getPrototypeOf(emp1) === Employee.prototype // true
Object.getPrototypeOf(emp2) === Employee.prototype // true
Object.getPrototypeOf(emp3) === Employee.prototype // true
Object.getPrototypeOf(mgr1) === Manager.prototype // true
Object.getPrototypeOf(mgr2) === Manager.prototype // true

我投票结束这个问题,因为关于编程风格和设计的问题属于codereview.stackexchange.com。好的,我删除这个问题。我们将在codereview.stackexchange.com上提问。请稍等,有些东西没有按您的要求运行,因此从这个角度来看,它属于这里。让我们看看其他人是否会投票重新打开此问题。
EmployeeScope()
有什么好处?你能评论一下你打算代码是如何工作的吗?我曾经想到过这种方法。它更改getName()的输出。对getName()的所有调用都返回上次创建的员工的姓名……这是因为员工构造函数中的
name
声明中缺少
var
:它随后成为一个全局变量。但是对于
var
它是有效的。这种方法的问题是它使name和dept属性可以公开访问。能够保持变量的私有性是我将函数包装在作用域中的主要动机。在这种情况下,不是围绕它的作用域。并将需要访问它的所有方法定义为构造函数范围内的闭包。然而,考虑到存在公开可用的setter和getter方法,因此将
名称
部门
保持为“私有”实际上是没有必要的。宁可放弃这些,只保留财产。简单性规则:-)Trincot的回答提出了同样的方法。它起作用了。谢谢。
function Employee(newName) {
  this.name = newName;
}
Employee.prototype.getName = function() {
  return this.name
};
Employee.prototype.setName = function(newName) {
  this.name = newName
};


function Manager(newName, newDept) {
  Employee.call(this, newName);
  this.dept = newDept;
}
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.getDept = function() {
  return this.dept
};
Manager.prototype.setDept = function(newDept) {
  this.dept = newDept
};

var emp1 = new Employee("John");
var emp2 = new Employee("Amit");
var emp3 = new Employee("Dirk");
var mgr1 = new Manager("Robert", "Data");
var mgr2 = new Manager("Alex", "Science");
Object.getPrototypeOf(emp1) === Employee.prototype // true
Object.getPrototypeOf(emp2) === Employee.prototype // true
Object.getPrototypeOf(emp3) === Employee.prototype // true
Object.getPrototypeOf(mgr1) === Manager.prototype // true
Object.getPrototypeOf(mgr2) === Manager.prototype // true