20230324----重返学习-instanceof关键字与in关键字-原型链

54 阅读2分钟

day-034-thirty-four-20230324-instanceof关键字与in关键字-原型链

instanceof关键字与in关键字

instanceof关键字

instanceof: 判断某个实例是不是属于某个类,属于true,不属于false

//instanceof: 判断某个实例是不是属于某个类, 属于true 不属于false
let arr=new Array();
console.log(arr instanceof Array);//true
console.log(arr instanceof Date);//false
console.log(arr instanceof Object);//true
console.log(Array);//是一个函数,也是一个构造函数,也是一个类

对于自定义函数也是可以的

function Fn(){
    this.num=100;
}
let f=new Fn();// f实例  Fn是类

console.log(f instanceof Fn);//true
console.log(f instanceof Object);//true
console.log(Fn);

in关键字

  • in: 用于检测当前对象是否存在某个属性

    • 只要自身或者沿着原型链能找到的,就返回true
    • 这个属性可以是实例对象自身的私有属性,也可以是它__proto__原型链上的公有属性。
let arr = [1, 2, 3];
console.log(arr);
console.log("length" in arr); //true
console.log("push" in arr); //true
console.log("isPrototypeOf" in arr); //true
console.log("fang" in arr); //false
  • 对于自定义函数也是可以的
function Fn() {
  this.num = 100;
}
Fn.prototype.getX = function getX() {};
let f = new Fn();
console.log(f);//Fn {num: 100}
console.log("num" in f); //true
console.log("getX" in f); //true
console.log("isPrototypeOf" in f); //true
console.log("fang" in f); //false

原型链

原型链是堆内存之间各个对象内存之间的关系,不涉及到栈内存。

函数作图中包含

  • 作用域

  • 函数体字符串

  • 函数键值对

    • 静态方法

    • 静态属性

      • prototype(原型),几乎所有的函数都有这个属性

        • prototype指向函数自己的原型对象

          • 原型对象是一个对象,也在是堆内存中

            • 原型属性

              • 原型对象都有一个属性constructor

                • 指向原型对象自己的构造函数
              • 原型对象都有一个属性__prototype

            • 原型方法

        • 没有prototype的函数

          • 箭头函数没有prototype
          • 基于ES6给对象某个成员赋值函数值的快捷操作(不具备prototype)

原型链上各个关系

函数的构造函数模式
  • 函数以构造函数模式执行

    • 函数在椎内存中包含

      • 作用域

      • 函数体字符串

      • 函数键值对

        • 静态方法

        • 静态属性

          • prototype(原型),几乎所有的函数都有这个属性

            • prototype指向函数自己的原型对象

              • 原型对象是一个对象,也在是堆内存中

                • 原型属性

                  • constructor,原型对象都有该属性