如何在javascript中访问对象原型?

2023-12-22

所有文章都写到 JavaScript 是一种基于原型的语言,这意味着每个对象都有一个原型(或者更准确地说,原型链)。

到目前为止,我已经尝试过以下代码片段:

var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1

我如何访问原型对象object1?有没有一种与浏览器无关的方法来做到这一点(我的意思是,不依赖于__proto__财产?见过this https://stackoverflow.com/questions/2242518/how-can-i-see-a-javascript-objects-prototype-chain链接,但也许自 2010 年以来有新的进展)如果我不能,你能分享一下背后的原理吗?


var f = function();
var instance = new f();

如果你知道名字instance 类函数,您可以简单地访问原型:

var prototype = f.prototype;
prototype.someMember = someValue;

如果您不这样做:

1)

var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;

2) or

var prototype = instance.__proto__;
prototype.someMember = someValue;

3) or

var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;

为了兼容性,您可以将以下代码片段放入代码中(并始终使用Object.getPrototypeOf(instance)返回原型):

if(!Object.getPrototypeOf) {

  if(({}).__proto__ === Object.prototype && ([]).__proto__ === Array.prototype) {

    Object.getPrototypeOf = function getPrototypeOf(object) {
      return object.__proto__;
    };

  } else {

    Object.getPrototypeOf = function getPrototypeOf(object) {

      // May break if the constructor has been changed or removed
      return object.constructor ? object.constructor.prototype : void 0;

    };

  }
}

UPDATE:

根据 ECMA-262 第 6 版(2015 年 6 月)__proto__属性被标准化为 Web 浏览器的附加功能。现在所有最新版本的顶级浏览器都支持它。阅读更多关于__proto__:

  • MDN: Object.prototype.__proto__ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

  • EDMA-262 第 6 版(2015 年 6 月):B.2.2.1 Object.prototype.__proto__ http://www.ecma-international.org/ecma-262/6.0/#sec-object.prototype.__proto__

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在javascript中访问对象原型? 的相关文章

随机推荐

  • PowerShell 范围标识符

    我是 PowerShell 新手 试图更好地理解范围 有没有办法从范围内识别范围 某些变量或函数可以给我某种范围名称或范围 Guid 或范围 Id 例如 我如何知道本地范围是否是全局范围 例如 我如何知道本地范围是否是全局范围 bool i
  • 如何验证传递给“PrincipalContext”的凭据

    这是后续我之前的问题 https stackoverflow com questions 50055073 testing a principalcontext using validatecredentialsnull null beha
  • ant 的 componentdef 错误

    我有一个相对较旧的 Grails 应用程序 它使用 ant 来构建应用程序 在测试服务器中 它构建没有任何问题 但是当我尝试在我的电脑上运行它时 我收到一致的错误 Caused by jar file C ant apache ant 1
  • Scala:理解参数多态性

    有什么区别 def drop1 A l List A l tail and def drop1 l List Int l tail 假设用法看起来像 drop1 List 1 2 3 何时应该使用其中之一 为什么 虽然我可以理解第二个例子
  • Swift“文本”不可用:自 iOS7 起已弃用 API。文本标签不起作用

    我一直有这个错误 我已经看到使用 textLabel text 回答了其他问题 但它在我的情况下不起作用 我是 swift 的新手 所以有人可以解释一下为什么以及如何解决这个问题 你需要打开包装textLabel通过使用 after tex
  • 将可变 Arc 引用传递给 hyper service_fn 处理程序时出现问题

    我一直在尝试以下 显示相关导入和代码 use std sync Arc Mutex use std thread use hyper rt self Future Stream use hyper service service fn us
  • 设置图例符号不透明度

    我正在绘制带有半透明 x 标记 20 alpha 的绘图 如何使图例中的标记以 100 不透明度显示 import matplotlib pyplot as plt plt plot date x xaxis y yaxis marker
  • C# 代码片段和汇编 TBB 有什么区别?

    据我了解 C 代码片段和 NET 程序集为模块化模板开发提供相同的功能 我们在 CME 中管理代码片段 在 Visual Studio 中管理汇编代码 但在模板生成器中使用相同的方式 在代码方面 我可以创建一个C 代码片段模板构建块 TBB
  • 更改 XSL 转换中的命名空间值?

    我不确定这是否可能 因为我对 XSLT 之类的东西非常陌生 但也许你们中的一些人可以在这里帮助我 这有点棘手 我在互联网上没有找到类似的东西 问题是我有一个输入 xml 其中声明了名称空间和所有内容 我只需要对其进行轻微更改 添加或删除属性
  • Django 静态文件应用程序帮助

    我对 Django 有一个小问题静态文件应用程序 https docs djangoproject com en dev ref contrib staticfiles 我已经添加了 django contrib staticfiles 到
  • React.js - Flux 与全局事件总线

    与全局事件总线相比 使用 Flux 有何优势 我认为调度程序就是所需要的 组件将带有数据的 用户事件 发布到调度程序 调度程序执行订阅商店的处理程序 处理程序发布 更新事件 以及商店的更新属性 调度程序执行订阅组件的处理程序 并使用存储的更
  • 在 python 中将 RAW 图像转换为 TIFF 但保留元数据

    我尝试将原始图像转换为 tiff 但我希望它保留元数据 这是我之前使用的代码 import rawpy imageio os with rawpy imread path as raw rgb raw postprocess imageio
  • Python 浮点格式

    我已经看到了一些与此相关的问题 但我读到的这些问题都没有帮助我真正理解为什么我想做的事情失败了 所以我有一堆浮点值 它们有不同的精度 有些是 0 1 其他是 1 759374 等 我想格式化它们 以便它们全部采用我尝试做的 0 000000
  • ilasm / ildasm 的 Java 字节码等效项

    对于 CIL MSIL 我可以在文本编辑器中编写代码并使用 ilasm ildasm 进行编译 反编译 我可以使用 Reflector 来查看 NET 类生成的 CIL 在Java世界中 javap c显示反汇编的字节代码 如何编译 Jav
  • 保存和删除 NSManagedObject 和 NSManagedObjectContext

    三个问题 但它们都是相关的 如果您愿意 我可以将它们分为三个问题 以便您获得更多学分 如果您愿意我这样做 请告诉我 我有以下代码允许我访问 NSManagedObject self managedObjectContext STAppDel
  • 使用 ipdb 默认进入粘性模式

    调试时使用ipdb 我发现输入很有用sticky模式遵循代码源 有没有办法在粘滞模式下自动输入而无需输入sticky 是的 从REAMDE https github com mverteuil pdbpp configuration and
  • 在 XAML 中为一个事件添加多个事件处理程序?

    在程序代码中可以执行以下操作 Add two event handler for the button click event button1 Click new RoutedEventHandler button1 Click 1 but
  • pow 函数中发生了什么?

    我在这里看到了各种描述奇怪行为的答案powC 中的函数 但我在这里有一些不同的问题要问 在下面的代码中我已经初始化了int x pow 10 2 and int y pow 10 n int n 2 在第一种情况下 当我打印它显示的结果时1
  • 如何在React Native中使用axios将图像上传到服务器?

    我想以本机方式将图像作为文件发送到服务器 我怎样才能做到这一点 这是我的代码 export const editUserProfile sessionId firstName lastName image countryCode phone
  • 如何在javascript中访问对象原型?

    所有文章都写到 JavaScript 是一种基于原型的语言 这意味着每个对象都有一个原型 或者更准确地说 原型链 到目前为止 我已经尝试过以下代码片段 var F function F prototype member1 1 var obj