【JS】自定义JS工具函数库-自定义对象方法-new-instanceof-mergeObject-实现数组与对象的深拷贝与浅拷贝-封装字符串相关函数

关于 自定义JS工具类 相关类似的源码请看 https://gitee.com/ykang2020/my_utils

1. 自定义new

创建Fn构造函数的实例对象

定义

/**
 * 自定义new
 * 创建Fn构造函数的实例对象
 * @param {Function} Fn
 * @param  {...any} args
 * @returns
 */
export default function newInstance(Fn, ...args) {
   
  // 1. 创建新对象
  // 创建空的object实例对象,作为Fn的实例对象
  const obj = {
   };
  // 修改新对象的原型对象
  // 将Fn的prototype(显式原型)属性赋值给obj的__proto__(隐式原型)属性
  obj.__proto__ = Fn.prototype;
  // 2. 修改函数内部this指向新对象,并执行
  //
  const result = Fn.call(obj, ...args);
  // 3. 返回新对象
  // return obj
  // 与new保持一直,如果构造函数有返回值,返回值是对象a就返回对象a,否则返回实例对象
  return result instanceof Object ? result : obj;
}

使用

import newInstance from "./object/newInstance";

function Person(name, age) {
   
  this.name = name;
  this.age = age;
}

const p = new Person("YK", 18);
console.log(p);
console.log(p.constructor);
console.log('************');
const p2 = newInstance(Person, "YK菌", 19);
console.log(p2);
console.log(p2.constructor);

console.log('************');

function Person2(name, age) {
   
  this.name = name;
  this.age = age;
  return {
    a: 100 };
}

console.log(new Person2());
console.log(newInstance(Person2));

结果

在这里插入图片描述

2. 自定义instanceof

判断obj是否是Fn类型的实例对象

定义

实现方法:Fn的原型对象是否是obj的原型链上的某个对象

/**
 * 自定义instanceof
 * 判断obj是否是Fn类型的实例对象
 * 实现方法:Fn的原型对象是否是obj的原型链上的某个对象
 * @param {Object} obj
 * @param {*} Fn 构造函数
 * @returns
 */
export default function myInstanceOf(obj, Fn) {
   
  // 得到obj的隐式原型对象
  let protoObj = obj.__proto__;
  // 原型对象存在,就遍历原型链
  while (protoObj) {
   
    // 实例对象的隐式原型 等于 构造函数的显式原型 就返回true
    if (protoObj === Fn.prototype) {
   
      return true;
    }
    // 不相等就根据原型链一直往上找 直到最后为null
    protoObj = protoObj.__proto__;
  }
  return false;
}

使用

import myInstanceOf from "./object/myInstanceOf";

function Person(name, age) {
   
  this.name = name;
  this.age = age;
}
const p = new Person("YK", 18);
console.log(myInstanceOf(p, Object), p instanceof Object);
console.log(myInstanceOf(p, Person), p instanceof Person);
console.log(myInstanceOf(p, Function), p instanceof 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值