1

我写了一个简单的javascript继承原型,但我遇到了问题..有人指导我正确的声明吗?

代码:

var Man = function(params){
  this.name = params.name,
  this.age = params.age,
  this.job = params.job;
}

Man.prototype.work = function(){
  return this.name +' is working as a ' + this.job;
}

var Women = function(params){
  this.name = params.name,
  this.age = params.age,
  this.job = params.job;
}

Women.prototype = new Man(); //assigning the prototype

var man1 = new Man({name:'man1',age:'age1',job:'job1'});
console.log(man1.work()); //it works

var woman1 = new Women({name:'woman1',age:'age2',job:'job2'});
console.log(woman1.work()); // it is not.. why?

我得到的错误:

TypeError: params is undefined
[Break On This Error]   

this.name = params.name,
4

2 回答 2

4

您收到此错误是因为您在Man没有任何参数的情况下调用:

Women.prototype = new Man();

由于在函数内部,paramsis undefined,访问params.name将引发异常。

这就是为什么这样设置原型不方便的原因之一。此时你并不想创建一个新的实例Man,你只想将它的原型挂接到原型链中。

更好地使用Object.create [MDN](包括 polyfill)来创建具有特定原型的对象:

Women.prototype = Object.create(Man.prototype);
Women.prototype.constructor = Women;

在里面Women,调用父构造函数(这不是一个肮脏的笑话)来传递参数:

function Women(params) {
    Man.call(this, params);
}
于 2013-01-17T12:24:25.573 回答
1

你没有将参数从女人传递给男人,试试这个:

Women.prototype = new Man({name:this.name,age:this.age,job:this.job});

实际上,这也可以:

Women.prototype = new Man(this);

优点是它只有 4 个字母的额外代码,这应该适用于所有支持 JS 的浏览器。

于 2013-01-17T12:21:58.473 回答