Maison > Questions et réponses > le corps du texte
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 ?
滿天的星座2017-06-14 10:55:03
var my=new Triangle(5,10);//[1]
my.getArea();//25 [2]
my.toString();//"Triangle" [3]
[1] Créer un objet d'instance Triangle mon,
this.name='Triangle';
this.side为 5;
this.height为 10;
[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
过去多啦不再A梦2017-06-14 10:55:03
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 ;
代言2017-06-14 10:55:03
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 choses
TwoDShape.prototype = {};
TwoDShape.prototype.__proto__ = Shape.prototype;
Shape.call(TwoDShape.prototype);
Même raison
Triangle.prototype = {};
Triangle.prototype.__proto__ = TwoDShape.prototype;
TwoDShape.call(Triangle.prototype);
var my = {};
my.__proto__ = Triangle.prototype;
Triangle.call(my, 5, 10);
Une fois exécutémy.toString()
的时候从my
自身成员开始找toString
,没有就沿着__proto__
往上找,最终在my.__proto__.__proto__
(也就是TwoDShape.prototype
)里找到了toString