var name = "this is window"
var a = {
name:"this is a",
callname:function(){
alert(this.name)
}
}
function B(){
alert(this.name)//this is B
}
B.prototype.name = "this is B";
B.prototype.callname = function(){
alert(this.name)
}
B.callname = function(){
alert(this.name)
}
//a.callname()
//B.callname()
//(new B()).callname()
Quelles sont les valeurs obtenues par les trois derniers ? ? ?
Avant de répondre à votre question, regardons un exemple
Décomposons votre problème un par un (veuillez utiliser les outils de développement du navigateur Chrome pour vérifier)
Que produit B.callname() ?
B est une fonction, son nom = "B", la méthode B.callname est appelée et l'appelant est B, alors ceci dans la méthode callname fait référence à B. Vous souvenez-vous de ce qu'est B.name ? Il suffit de regarder le premier exemple ci-dessus pour comprendre.
Vous vous demanderez pourquoi « ceci est B » n'est-il pas défini par B.prototype.name ? Parce que les propriétés définies dans le prototype de B ne sont directement accessibles que par les instances de B.
Si vous n'y croyez toujours pas, veuillez changer tous les noms, tels que xname, et la réponse à cette question deviendra indéfinie
a.callname() Que produit-il ?
a lui-même est une instance d'objet, définie en JSON. Le code ci-dessus est équivalent à
L'appelant de callname est un, alors celui-ci dans callname est un
(new B()).callname() Que produit-il ?
Tout d'abord,
new B()
est exécuté en premier, créant une instance anonyme Nommons-la temporairement b, c'est-à-direb = new B()
, dans la fonction B This. est appelé b à ce moment, puis l'alerte de méthode dans le corps de la fonction B est exécutée séquentiellement. Qu'est-ce que b.name ? b est une instance. Il n'a pas d'attribut name. Il recherchera le nom dans la définition du prototype de la classe parent et trouvera "c'est B".new B()
先执行, 创建了一个匿名实例,我们暂且给他命名为b, 即b = new B()
, 函数B中的this此时被指代为 b, 然后才是依次执行B函数体内的方法alert, b.name是什么?b是个实例,它本身没有name属性, 就会去父类的prototype定义中找name,找到了 "this is B".然后,
b.callname()
Ensuite,b.callname()
est exécuté et callname est défini. Cela fait référence à l'appelant de la méthode b. L'instance b elle-même n'a pas d'attribut name. Elle trouvera la valeur de l'attribut name du prototype dans la classe parent et la renverra.Dans le premier, cela représente l'objet a, donc c'est un pop-up. Dans le second, B représente la fonction B, et dans le troisième, c'est B qui apparaît en premier, car lors de l'instanciation La fonction sera exécutée. Il y aura alors une erreur de syntaxe car il n’y a pas de point-virgule dans l’instruction précédente (nouveau B()). S'il n'y a pas d'erreur de syntaxe, une autre ceci est B apparaîtra car l'objet instance appelle l'attribut name sur l'objet prototype.