0

0

js怎么检测原型链中的构造函数

小老鼠

小老鼠

发布时间:2025-08-24 13:29:01

|

204人浏览过

|

来源于php中文网

原创

首先使用object.getprototypeof()逐层遍历原型链以检测构造函数,1. 通过循环从对象开始向上查找,比较每层的constructor是否匹配目标构造函数;2. 若找到则返回true,否则继续遍历直至原型链末端null并返回false;3. 为防止原型链污染,应避免使用__proto__等非标准属性,优先采用标准方法object.getprototypeof();4. 防御污染的有效方式是使用object.create(null)创建无原型的干净对象,并仅复制可信的自有属性;5. 判断对象是否直接继承自某构造函数时,需使用object.getprototypeof(obj) === constructor.prototype进行严格相等比较,确保是直接继承而非通过原型链间接继承。该方法完整覆盖了原型链检测、安全防护及继承关系判断的核心需求。

js怎么检测原型链中的构造函数

检测JavaScript原型链中的构造函数,其实没有一个“一键搞定”的魔法棒。你需要一层层地往上爬,直到找到你想找的构造函数,或者爬到尽头——

null

js怎么检测原型链中的构造函数

解决方案

最直接的方法就是使用

instanceof
操作符,但它只能告诉你某个对象是否是某个构造函数的实例,而不能直接告诉你原型链上所有构造函数。所以,我们需要一个循环,手动遍历原型链。

js怎么检测原型链中的构造函数
function checkPrototypeChain(obj, targetConstructor) {
  let current = obj;

  while (current) {
    if (current.constructor === targetConstructor) {
      return true;
    }
    current = Object.getPrototypeOf(current);
  }

  return false;
}

// 示例
function MyObject() {}
const myInstance = new MyObject();

console.log(checkPrototypeChain(myInstance, MyObject)); // true
console.log(checkPrototypeChain(myInstance, Object));   // true
console.log(checkPrototypeChain(myInstance, Array));    // false

这个函数从给定的对象开始,沿着原型链向上查找,每次检查当前对象的构造函数是否与目标构造函数匹配。如果找到匹配项,则返回

true
;如果到达原型链的末尾(即
current
变为
null
),则返回
false

如何避免原型链污染带来的安全风险?

js怎么检测原型链中的构造函数

原型链污染是个挺烦人的问题,特别是当你处理来自不受信任来源的数据时。攻击者可能会修改

Object.prototype
,从而影响到你代码中的每一个对象。

一个简单的防御方法是冻结

Object.prototype
,但这可能会破坏一些依赖于修改原型链的库。更好的方法是在使用从外部来源获取的数据时,创建一个没有原型的新对象,然后将数据复制到这个对象中。

AIPAI
AIPAI

AI视频创作智能体

下载
function createSafeObject(data) {
  const safeObject = Object.create(null); // 创建一个没有原型的对象
  for (const key in data) {
    if (Object.hasOwn(data, key)) { // 确保只复制自身的属性
      safeObject[key] = data[key];
    }
  }
  return safeObject;
}

// 示例
const untrustedData = JSON.parse('{"__proto__": {"isAdmin": true}}');
const safeData = createSafeObject(untrustedData);

console.log(safeData.isAdmin); // undefined
console.log(({}).isAdmin);      // undefined (如果 Object.prototype 没有被污染)

这样可以有效地隔离不受信任的数据,防止它污染你的原型链。

Object.getPrototypeOf()
__proto__
有什么区别

Object.getPrototypeOf()
是一个标准方法,用于获取对象的原型。而
__proto__
是一个非标准属性,虽然大多数浏览器都支持它,但它不应该被用于生产代码中。
Object.getPrototypeOf()
更可靠,也更符合规范。

const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
console.log(obj.__proto__ === Object.prototype);              // true (但最好别用)

使用

Object.getPrototypeOf()
可以避免一些潜在的问题,例如,如果一个对象覆盖了
__proto__
属性,那么你可能无法正确地获取它的原型。

如何判断一个对象是否直接继承自某个构造函数,而不是通过原型链?

有时候,你可能只想知道一个对象是否直接继承自某个构造函数,而不是通过原型链。可以使用

Object.getPrototypeOf()
和严格相等(
===
)来判断。

function isDirectInstanceOf(obj, constructor) {
  return Object.getPrototypeOf(obj) === constructor.prototype;
}

function MyObject() {}
const myInstance = new MyObject();

console.log(isDirectInstanceOf(myInstance, MyObject)); // true
console.log(isDirectInstanceOf(myInstance, Object));   // false

这个函数检查对象的原型是否与构造函数的

prototype
属性严格相等。如果是,则说明对象直接继承自该构造函数。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

237

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

515

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5330

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

481

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.1万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

Excel 教程
Excel 教程

共162课时 | 14.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号