javascript prototypal inheritance and the 'new' keyword
I've been playing around with prototypal inheritance in JavaScript and have been confused by the behavior of the new
keyword. I cannot understand why the [[prototype]]
property of the inheriting object points to Function.prototype
and not the prototype of the inherited object. Consider 2 constructor functions (below):
function Animal(name) {
this.name = name;
}
function Cat(name) {
Animal.call(this, name);
}
Cat.prototype = new Animal();
Querying the prototype of the constructor function Cat
, I get some interesting results:
Cat.__proto__ === Animal.prototype; //returns false -- shouldn't this be true?
Cat.__proto__ === Function.prototype; //returns true
Cat.prototype instanceof Animal; //returns true, as expected
My understanding was that the [[prototype]]
of Cat
should be updated to point to Animal.prototype
when we set it's prototype property to a new instance of Animal
, which should in essence
Animal.prototype
and Cat.[[prototype]]
to Animal
's external prototype property? I've tried this in both Chrome and FF with the same result. What gives?
Also, when we assign Cat.prototype
to a new Animal()
, what should Cat.prototype
be? ie:
//if Cat.prototype = new Animal();
//then
Cat.prototype === Animal.prototype; //get false. Should this be true?
Cat.__proto__ === Animal.prototype; //returns false -- shouldn't this be true?
Cat.__proto__ === Function.prototype; //returns true
The Cat
constructor is a function. Therefore, it inherits from Function.prototype
which in turn inherits from Object.prototype
. This is also true for the Animal
constructor and all other function objects.
Just because you assigned to Cat.prototype
doesn't change the inheritance link of the Cat
constructor itself (inheritance links are immutable anyway).
Note that Cat
instances don't inherit from Cat
, but from Cat.prototype
. So, you don't care about the prototype link of the Cat
constructor anyway.
That the [[prototype]] property is owned by Object instead of by Constructor function. So in your example,you will find that
Cat.prototype.__proto__ === Animal.prototype; //Return true
Common say
Instance.__proto__ === Constructor.prototype; //Retrun true
Cat is a Constructor function that is a instance of Function type,so you saw this result
Cat.__proto__ === Function.prototype; //Return true
My english is so terriable,but I wish that I have explained something. :-)
链接地址: http://www.djcxy.com/p/30058.html上一篇: VS. JavaScript中的原型