【问题标题】:Parameters not being passed through two levels of JavaScript constructors未通过两级 JavaScript 构造函数传递参数
【发布时间】:2014-09-03 23:33:12
【问题描述】:

运行以下代码时,我在传递参数时收到类型错误。看来我无法将我的 JSON 数据作为参数传递给 Employee 对象。

这是我收到的错误:

/home/ubuntu/test/tests/employee.js:4
     this.name = params['name'] || "";
                  ^
TypeError: Cannot read property 'name' of undefined

下面是代码:

//comment

var Employee = function (params) {
    this.name = params['name'] || "";
    this.dept = params['dept'] || "general";
}

function Manager () {
    this.reports = [];
}
Manager.prototype = new Employee;

function WorkerBee (params) {
    console.log("params "+params);
    this.base = Employee;
    this.base(params);
    //    this.projects = params['projs'] || [];                                                                                                                                      
}

WorkerBee.prototype = new Employee;

function Engineer (params) {
    this.base = WorkerBee;
    this.base(params);
    params['projs']="engineering";
    //    this.base(params['name'], "engineering", params['projs']);                                                                                                                  
    this.machine = params['mach'] || "";
}
Engineer.prototype = new WorkerBee;


var jane = new Engineer({'name': "Doe, Jane", 'projs':["navigator", "javascript"], 'mach':"belau"});
console.log(jane);

如能纠正此示例,我们将不胜感激。

【问题讨论】:

  • 我认为问题出在这个(没有传递参数):Manager.prototype = new Employee
  • Engineer.prototype = new WorkerBee; 这些正在调用构造函数,但您没有向其中任何一个传递任何参数
  • 我应该在调用新构造函数时输入 Manager.prototype = new Employee(params) 吗?当我这样做时,我得到一个参考错误-> ReferenceError: params is not defined。当我使用每个站点的有序参数集时,代码可以正常工作:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…。就在我重构代码以减少依赖时,我开始遇到传递数据的问题。
  • 您需要使用this.base.call(base, params),而不是this.base(params)

标签: javascript oop object inheritance hierarchy


【解决方案1】:

这就是为什么当你想建立继承时你不应该创建一个新的父实例:如果构造函数需要一个参数,你传递什么?

您应该改用Object.create

Child.prototype = Object.create(
  Parent.prototype,
  {constructor: {value: Child, configurable: true, writable: true}}
);

你还必须调用父构造函数

Parent.call(this, arg1, arg2, ...);

在子构造函数中。而

this.base = WorkerBee;
this.base(params);

确实有效,它有点不合常规。


更多信息在:Benefits of using `Object.create` for inheritance

【讨论】:

  • 很好解释。感谢您的回复和信息。一切顺利。
  • 不,this.base(params)工作。它将调用没有this 的基本构造函数。它相当于WorkerBee(params),它将在没有上下文的情况下调用WorkerBee。正如你所指出的,需要WorkerBee.call(this, params)
  • @torazaburo:不,如果您有foo.bar(),那么bar 中的this 将引用foo。这就像在this 上调用一个方法。正如我所说,这很不寻常,但它确实有效。
  • 这是一个支持@Felix 关于 Foo.bar() 内部关键字的观点的网站。参考实例对象部分:blog.kevinchisholm.com/javascript/…
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多