使用原型链的问题

时间:2010-11-01 09:45:42

标签: javascript

如果我有一个带有许多参数的构造函数:

var Mammal = function(name, weight) {
    this.name = name;
    this.weight = weight;
}


Mammal.prototype.makeSound = function(sound) {
    alert(sound);
} 

Mammal.prototype.getName = function() {
    return this.name;
}

我想做一些遗产:

var Human = function(name,weight,language,location) {
    //code         
}

Human.prototype = new Mammal();

在最后一行中,不是人类原型得到的名称和重量参数未定义?我一直看到这段代码....我知道人类构造函数正在被赋予名称和权重参数,但是原型获得这些未定义的值似乎很混乱。我知道这只有效,因为javascript足够松弛,可以让你这样做。有没有办法绕过这个?

2 个答案:

答案 0 :(得分:2)

你到底困扰什么?

Human.prototype = new Mammal();
alert( Human.prototype.name ); // undefined
alert( Human.prototype.foo );  // undefined

你可以认为他们不在那里。你不写的原因是:

Human.prototype = Mammal.prototype;

是因为Mammal构造函数可以添加原型对象上没有的方法。

var Mammal = function(name, weight) {
    this.name = name;
    this.weight = weight;
    this.somefun = function() {
      // this can't be inhereted by
      // Mammal.prototype
    }
}

为了不让自己重新开始,你可以使用 Constructor Chaining

var Human = function(name,weight,language,location) {
    this.language = language;
    this.location = location;
    // call parent constructor
    Mammal.apply(this, arguments);       
}

这似乎更直截了当,不是吗?您调用父构造函数来处理nameweight参数,而您只关心Human构造函数中的Human个特定事物。

答案 1 :(得分:1)

我想我曾经见过这样的事情:

var Human = function(name,weight,language,location) {
    Mammal.call(this, name, weight);//calls the parent constructor        
    this.language = language;
    this.lcoaiton = location;
}

Human.prototype = new Mammal();