javascript手写操作符

简介: 手写JavaScript中的操作符

手写JavaScript中的操作符

手写new操作符

MDN 中对 new 运算符是这么介绍的:new 运算符创建一个用户定义的对象类型的实例具有构造函数的内置对象的实例

总的来说,new 要返回一个对象实例,如何实现呢?MDN 已经给出了 new 运算符的作用

  1. 创建一个空的简单JavaScript对象(即**{}**);
  2. 为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象 ;
  3. 将步骤1新创建的对象作为**this**的上下文 ;
  4. 如果该函数没有返回对象,则返回**this**

那我们就根据这4步来实现,即可完成一个基础的 new 运算符

function myNew(fn, ...agrs){
    if(typeof fn !== "function") {
        throw new Error('The first args must be a function');
    }
    // 1、创建一个空的简单JavaScript对象(即{});
    let obj = {};
    // 2、为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象 ;
    obj.__proto__ = fn.prototype;
    // 3、将步骤1新创建的对象作为this的上下文 ;
    const res = fn.apply(obj, agrs)
    // 4、如果该函数没有返回对象,则返回this。
    return typeof res === "object" ? res : obj;

    // obj.constructor(...agrs); // 3、4步 也可以直接调用构造函数获取值返回
};

手写 instanceof 操作符

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,常用于检测 引用类型 变量的数据类型

JavaScript的原型链,用如下图来表示

JavaScript的原型链

代码解释

function Person() {} // 定义一个Person构造函数
var person = new Person(); // 通过构造函数实例化一个对象

// 实例对象的__proto__属性指向了实例原型prototype
console.log(person.__proto__ === Person.prototype);
// 通过 Object.getPrototypeOf 获取 对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype);

// 这三行就揭示了原型链
console.log(person.__proto__ === Person.prototype);
console.log(Person.prototype.__proto__ === Object.prototype);
console.log(Object.prototype.__proto__ === null);

console.log(person instanceof Person);
console.log('instanceof_f', instanceof_f(person, null));

// 手写实现instanof运算符
function instanceof_f(l, r) {
    if (!Object.prototype.hasOwnProperty('prototype') || !r.prototype) {
        return false;
    }
    if (l.__proto__ === r.prototype) {
        return true;
    }else{
        // 使用递归代码清晰易懂
        return instanceof_f(l.__proto__, r);
    }
}

Person.prototype.name = "K";
person.name = "G";
Object.prototype.name = "V";

console.log(person.name);
delete person.name;
console.log(person.name);
delete Person.prototype.name;
console.log(person.name);
delete Object.prototype.name;
console.log(person.name);
目录
相关文章
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中算术操作符:全面解读、实战应用与最佳实践
【4月更文挑战第5天】本文探讨JavaScript中的算术操作符,包括加、减、乘、除、求余、自增、自减及复合赋值等,强调理解与熟练运用它们对提升编程效率和代码准确性的重要性。文中通过示例介绍了各种操作符的用法,同时提醒注意数据类型转换、浮点数精度、除以零错误以及利用短路求值优化逻辑等问题。通过学习,读者能更好地掌握算术操作符在不同场景的应用,提升编程技能。
81 1
|
7月前
|
JavaScript 前端开发 安全
javascript中的可选链操作符
javascript中的可选链操作符
|
4月前
|
JavaScript 前端开发 开发者
深入解析JavaScript中的比较操作符
【8月更文挑战第20天】
29 0
|
7月前
|
JavaScript 前端开发
探索JavaScript中的New操作符:原理与使用
探索JavaScript中的New操作符:原理与使用
|
7月前
egg.js 24.12sequelize模型-where操作符
egg.js 24.12sequelize模型-where操作符
63 1
egg.js 24.12sequelize模型-where操作符
|
JavaScript
JS new操作符的具体干了什么?
JS new操作符的具体干了什么?
59 1
|
JavaScript 前端开发 索引
JavaScript Day02 操作符及类型转换与流程控制语句 3
JavaScript Day02 操作符及类型转换与流程控制语句 3
75 0
|
Web App开发 JavaScript 前端开发
JavaScript Day02 操作符及类型转换与流程控制语句 1
JavaScript Day02 操作符及类型转换与流程控制语句 1
80 0
|
存储 JavaScript 前端开发
javascript基本语法学习(变量、数据类型、操作符、条件语句、循环)
javascript基本语法学习(变量、数据类型、操作符、条件语句、循环)
|
JavaScript
【new操作符做了什么 —— js】
【new操作符做了什么 —— js】