8

So I'm learning Javascript and all its' prototype goodness, and I am stumped over the following:

Say I have this

var Animal = function (a, b, c, d, e, f, g, h, i, j, k , l, m, n){
   this.a = a;
   this.b = b;
   //...etc...
};

var x = new Animal(1,2,3....);

Now how do I create a Cat constructor function that inherits from the Animal constructor function such that I don't have to type the super long arguments again?

In other words I don't want to be doing this:

var Cat = function (a, b, c, d, e, f, g, h, i, j, k , l, m, n){
   this.a = a;
   this.b = b;
   //...etc...
};

// inherit functions if any
Cat.prototype = new Animal;

var y = new Cat(1,2,3....);

Thanks in advance! j

2 Answers 2

9

How's this?

var Cat = Function (a, b, c, d, e, f, g, h, i, j, k , l, m, n){
   Animal.apply(this, arguments);
};

// inherit functions if any
Cat.prototype = new Animal;

var y = new Cat(1,2,3....);
Sign up to request clarification or add additional context in comments.

8 Comments

"arguments" is a very powerful variable that is automatically in the scope of any function call... look here for more info: seifi.org/javascript/javascript-arguments.html
Yuo wouldn't even need to declare the argument list, (a, b, c and so on), in the Cat function. arguments would still contain the values sent in the new Cat(1,2,3...) call.
Careful: the prototype= new Animal call instantiates an Animal, calling the constructor function with all the arguments set to undefined. For a simple constructor that just stores its argument this is acceptable, but for anything more complicated it'll break. Background and (lengthy!) discussion: stackoverflow.com/questions/1595611/…
Also, the Animal.apply bit in it self is not inheritance or making use of prototypes. Animal.apply could be called with any object, also an object that does not inherit from Animal.
@Lars#2: So what? It still answers the question.
|
1

It quickly becomes tedious to remember the order and meaning of long lists of parameters like this.

You can add some flexibility if you pass the properties of a new Animal as an object- and it is not so hard to remember as a long list of argument indexes.

function Animal(features){
 for(var p in features){
  this[p]= features[p];
 }
};

You can give every cat some basic cat features automatically, 
and add specifics when you make a new cat.

function Cat(features){
 for(var p in features){
  this[p]= features[p];
 }
}
Cat.prototype= new Animal({legs: 4, eats: 'meat', type: 'mammal', whiskers: true});
Cat.prototype.constructor=Cat;

var Tiger= new Cat({tail: true, hunter: true});
Tiger begins with these properties:

tail: true
hunter: true
legs: 4
eats: meat
type: mammal
whiskers: true

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.