Maison interface Web js tutoriel javascript instanceof 内部机制探析_javascript技巧

javascript instanceof 内部机制探析_javascript技巧

May 16, 2016 pm 06:18 PM
instanceof

比如:

复制代码 代码如下:

// 代码 1
function Pig() {}
var pig = new Pig();
alert(pig instanceof Pig); // => true

function FlyPig() {}
FlyPig.prototype = new Pig();
var flyPig = new FlyPig();
alert(flyPig instanceof Pig); // => true

来看另一段代码:
复制代码 代码如下:

// 代码 2
function Pig() { Pig.prototype = {/* some code */} }
var pig = new Pig();
alert(pig instanceof Pig); // => false

为何上面的猪 pig 不再是猪 Pig 了呢?
当一个对象是某个类的实例时,意味着这个对象具有该类的方法和属性。在 JavaScript 中,一个猪类的特性体现在原型中:
复制代码 代码如下:

// 代码 3
function Pig() {}
Pig.prototype = {
"吃猪食": function() {},
"睡觉": function() {},
"长膘": function() {}
};
var pig = new Pig();
alert(pig instanceof Pig); //=> true

如果动态改变了猪的特性,让猪变成了牛:
复制代码 代码如下:

// 代码 4
Pig.prototype = {
"吃草": function() {},
"犁田": function() {}
};
var niu= new Pig();
alert(pig instanceof Pig); //=> false
alert(niu instanceof Pig); //=> true

当未改变 Pig 的 prototype 时,猪还是猪,因此代码 3 中 pig 是 Pig 的实例。当改变 prototype 后,猪已经不是猪,而是披着猪皮的牛了。因此代码 4 中 pig 不再是 Pig 的实例,niu 反而是 Pig 的实例。

进一步分析前,先回顾一下 new 的内部机制。代码 2 中的 new Pig() 实际上等价为:
复制代码 代码如下:

// var pig = new Pig() 的等价伪代码:
var pig = (function() {
var o = {};
o.__proto__ = Pig.prototype; // line 2
Pig.call(o);
Pig.prototype = {/* some code */}; // line 4
return o; // line 5
})();

可以看出,在 line 2 时,o.__proto__ 指向了 Pig.prototype 指向的值。但在 line 4 时,Pig.prototype 指向了新值。也就是说,在 line 5 返回时,pig.__proto__ !== Pig.prototype. 正是这个变化,导致了代码 2 中的 pig 不是 Pig.

已经可以大胆推论出:instanceof 判断 pig 是不是 Pig 的依据是:看隐藏的 pig.__proto__ 属性是否等于 Pig.prototype !

为了进一步确认,我们可以在 Firefox 下模拟 instanceof 的内部实现代码:
复制代码 代码如下:

/**
* Gecko 引擎下,模拟 instanceof
*/
function _instanceof(obj, cls) {
// instanceof 的左操作数必须是非null对象或函数对象
if((typeof obj !== "object" || obj === null)
&& typeof obj !== "function") {
return false;
}

// instanceof 的右操作数必须是函数对象
if(typeof cls !== "function") {
throw new Error("invalid instanceof operand (" + cls + ")");
}

// 向上回溯判断
var p = obj.__proto__, cp = cls.prototype;
while(p) {
if(p === cp) return true;
p = p.__proto__;
}
return false;
}

测试页面:simulate-intanceof.html

最后考考大家:
复制代码 代码如下:

function Bird() {}
var bird = new Bird();
var o = {};
bird.__proto__ = o;
Bird.prototype = o;
alert(bird instanceof Bird); // true or false?
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que fait instanceof ? Que fait instanceof ? Nov 14, 2023 pm 03:50 PM

La fonction de instanceof est de déterminer si un objet est une instance d'une certaine classe ou s'il implémente une interface. instanceof est un opérateur utilisé pour vérifier si un objet est d'un type spécifié. Scénarios d'utilisation de l'opérateur instanceof : 1. Vérification de type : peut être utilisée pour déterminer le type spécifique d'un objet, afin d'effectuer différentes logiques selon différents types 2. Jugement d'interface : peut être utilisé pour déterminer si un objet implémente une interface ; , afin de déterminer si un objet implémente une interface. La définition de l'interface appelle la méthode correspondante 3. Transformation vers le bas, etc.

Comment utiliser l'opérateur instanceof en Java Comment utiliser l'opérateur instanceof en Java May 19, 2023 am 08:16 AM

Concept 1. Cet opérateur permet d'opérer sur des objets et de vérifier si l'objet est d'un type spécifique (type ou type d'interface). Format 2. Si l'objet pointé par la variable sur le côté gauche de la calculatrice est un objet de la classe ou de l'interface sur le côté droit de l'opérateur, le résultat est vrai. (Objectreferencevariable)instanceof(class/interfacetype) instance packagecom.verify_instanceof;publicclassTestInstanceOf{publicstaticvoidmain(String[]args){//Les quatre lignes de code suivantes sont utilisées pour prouver : instanceof

Que signifie instanceof ? Que signifie instanceof ? Nov 20, 2023 pm 02:32 PM

Instanceof est un opérateur en JavaScript, utilisé pour détecter si l'attribut "prototype" du constructeur apparaît n'importe où dans la chaîne de prototypes de l'objet. La syntaxe est "object instanceof constructor", où object est l'objet à détecter et constructor est le. objet à détecter. Constructeur à vérifier.

Que signifie instanceof en Java Que signifie instanceof en Java Nov 13, 2023 pm 01:52 PM

En Java, instanceof est un opérateur binaire utilisé pour vérifier si un objet est une instance d'une classe ou une instance d'une sous-classe d'une classe. Sa syntaxe est "object instanceof class", où object est un objet. Citation, class est une classe. nom ou nom de l'interface.

Pourquoi une erreur sera-t-elle signalée sans ajouter d'instance de ? Pourquoi une erreur sera-t-elle signalée sans ajouter d'instance de ? Nov 13, 2023 pm 03:05 PM

La raison est la suivante : l'opérateur instanceof est utilisé pour vérifier si un objet est une instance d'une classe spécifique (ou sa classe dérivée). Si l'objet n'est pas une instance d'une classe, la détermination du type ne peut pas être effectuée et une erreur est générée. Pour éviter cette erreur, lorsque vous utilisez l'opérateur instanceof, vous devez vous assurer que l'objet est une instance d'une classe. Si vous n'êtes pas sûr du type d'un objet, vous pouvez utiliser d'autres méthodes pour déterminer le type.

opérateur instanceof en Java opérateur instanceof en Java Sep 01, 2023 pm 08:01 PM

Cet opérateur n'est utilisé que pour les variables de référence d'objet. Cet opérateur vérifie si un objet appartient à un type spécifique (type classe ou type interface). L'opérateur instanceof est écrit comme -(Objectreferencevariable)instanceof(class/interfacetype) Si l'objet référencé par la variable sur le côté gauche de l'opérateur réussit la vérification IS-A du type classe/interface sur le côté droit, le résultat sera être fidèle. Voici un exemple - Exemple de démonstration en direct publicclassTest{ publicstaticvoidmain(Stringargs[]){&nbs

Pourquoi devons-nous forcer le transfert après instanceof ? Pourquoi devons-nous forcer le transfert après instanceof ? Nov 14, 2023 pm 03:43 PM

Lorsque vous utilisez l'opérateur instanceof pour vérifier le type d'un objet, si le résultat est vrai, cela signifie que l'objet est une instance du type spécifié. Cependant, le compilateur ne convertit pas automatiquement l'objet vers le type spécifié, un transtypage est donc requis. Le casting est l'opération de conversion d'un objet d'un type à un autre. Après avoir utilisé l'opérateur instanceof, si vous déterminez que l'objet est une instance du type spécifié et que vous souhaitez fonctionner avec ce type, vous devez effectuer une conversion de type cast.

Pourquoi ne pas utiliser instanceof Pourquoi ne pas utiliser instanceof Nov 14, 2023 pm 04:05 PM

Les raisons pour lesquelles vous n'utilisez pas instanceof sont les suivantes : 1. Le langage de programmation que vous utilisez peut ne pas prendre en charge l'opérateur instanceof ; 2. Vous pensez que l'utilisation d'autres méthodes peut mieux répondre aux exigences. Dans certains cas, l'utilisation d'autres méthodes pour vérifier le type d'objet peut être utilisée. être plus efficace ou plus adapté à vos besoins ; 3. Vous ne savez pas comment l'opérateur instanceof est utilisé ou vous n'êtes pas sûr de son comportement ; 4. Dans certains cas, l'utilisation de "instanceof" peut ne pas être le meilleur choix.

See all articles