function Shape(){
this.name='Shape';
this.toString=function(){
return this.name;
};
}
function TwoDShape(){
this.name='2D shape';
}
function Triangle(side,height){
this.name='Triangle';
this.side=side;
this.height=height;
this.getArea=function(){
return this.side*this.height/2;
};
}
TwoDShape.prototype=new Shape();
Triangle.prototype=new TwoDShape();
var my=new Triangle(5,10);
my.getArea();//25
my.toString();//"Triangle"
1.Lorsque my.toString() est appelé, quel est le chemin d'exécution du moteur JavaScript ?
[1] Créer un objet d'instance Triangle mon,
[2] Appelez la méthode getArea sur l'objet d'instance Triangle my
[3] Appelez la méthode toString sur l'objet d'instance Triangle my et constatez qu'elle n'existe pas sur l'objet actuel. Suivez la chaîne de prototypes pour trouver l'instance TwoDShape. S'il n'existe pas encore, allez dans l'instance Shape. Montez et cherchez l'objet, OK, trouvez-le.
Cet objet à ce moment est l'objet d'instance Triangle my, la valeur de l'attribut name dessus est Triangle et la sortie est
1 : Comprenez d'abord la relation entre les types et les instances. La forme est un type (abstrait), var shape = new Shap(); la forme est une instance ;
2 : La question est trop vague, var shape = new Shap(); et Quelle est la relation entre le constructeur de var sh = Shape() => Le constructeur de shape est Shape.prototype.constructor; (Comment shape et sh peuvent-ils être liés ~)
3 : Pourquoi ne pas hériter directement ? Conçu comme ça ;
Vous pouvez le voir en décomposant tout cela. Tout d'abord, regardez la logique de fonctionnement du nouveau
.TwoDShape.prototype = new Shape();
Il fait trois chosesMême raison
Une fois exécuté
my.toString()
的时候从my
自身成员开始找toString
,没有就沿着__proto__
往上找,最终在my.__proto__.__proto__
(也就是TwoDShape.prototype
)里找到了toString