- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
MDN 有一个关于修改代码原型(prototype)的巨大警告:
Changing the
[[Prototype]]
of an object is, by the nature of how modern JavaScript engines optimize property accesses, a very slow operation, in every browser and JavaScript engine. The effects on performance of altering inheritance are subtle and far-flung, and are not limited to simply the time spent in theObject.setPrototypeOf(...)
statement, but may extend to any code that has access to any object whose[[Prototype]]
has been altered. If you care about performance you should avoid setting the[[Prototype]]
of an object. Instead, create a new object with the desired[[Prototype]]
usingObject.create()
.
我想知道是否在某些情况下您可以修改对象的原型(prototype), 不会导致级联优化效果,从而降低程序的性能。好像应该有。例如,如果您仅在创建对象之后(并且在它被其他任何东西使用之前)修改原型(prototype)。但我认为这非常依赖于引擎。
那么有人知道是否有有效的方法来修改对象的原型(prototype)吗?
编辑:提出这个问题的动机是希望创建实际上继承自 Function
的对象。我知道如何做到这一点的唯一方法是修改函数的原型(prototype)。请在此处查看雷诺斯答案的最底部:javascript class inherit from Function class
最佳答案
The motivation for this question comes from a desire to create objects that actually inherit from Function.
看来您正在尝试执行以下操作:
__proto__
属性)设置为引用Fuction.prototype这样它们就可以从 Function.prototype
继承属性,例如:
.apply
.call
.bind
您永远不需要更改任何对象的原型(prototype),只要您可以在创建对象时将其正确设置为所需的引用即可。
您可以使用 Object.create()
在创建时设置任何对象的原型(prototype)。请注意,将任何对象的原型(prototype)分配给 Function.prototype
将不会使该对象成为可调用函数。但是,如果您仍想将原型(prototype)分配给 Function.prototype
或某个其他对象,您可以执行以下操作:
var obj1 = Object.create(Function.prototype);
这将:
obj1
__proto__
属性)以引用 Function.prototype
或您作为参数传入的任何对象
Function.prototype
(这就是 JavaScript 原型(prototype),__proto__
指的是:委托(delegate)失败的属性查找的地方)这不要求您使用Object.setPrototypeOf()
来更改现有对象的原型(prototype),因为它会在创建对象时分配原型(prototype)。请参阅 Object.create() 的 MDN 文档有关更多示例和信息——这不会带有与 setPrototypeOf()
相同的可怕警告。您可以使用 Object.create()
来设置任何新对象的原型(prototype)。
也就是说,如果您想要一个行为类似于函数的对象,您可以简单地创建一个函数。函数仍然是一个对象,但具有额外的函数特定属性和行为;您仍然可以通过为其分配属性来将其视为对象。如果您希望创建一个也像对象一样工作的函数,或者一个也可以做与函数相同的事情的对象,那么函数已经做到了。您可以执行以下操作:
var func = function() { return 'hello world'; }; // func is a function
func.property1 = 'foo'; // func is also an object
func.property2 = 'bar';
您问题的最佳解决方案可能是利用函数实际上已经是具有附加功能的对象这一事实。
关于javascript - 有没有有效的方法在 javascript 中使用 `__proto__` 或 `setPrototypeOf()`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480170/
我的理解是 Object.__proto__ 是 javascript 中的“顶级”原型(prototype)对象。我希望它的 __proto__ 为空,但在谷歌浏览器中(没有尝试过其他浏览器),它不
为什么 Object.__proto__ === Function.__proto__ 在 JavaScript 中? 这样设计的目的是什么? 最佳答案 __proto__ property对象的原型
我一直在研究 prototype chain在 Javascript 中,这个主题让我想知道...是否有一个通用名称或术语来指代原型(prototype)链末尾的所有其他对象? 我正在 GitHub
似乎在 JavaScript (ES6) 类中 super.__proto__ === this.__proto__ . 您能解释一下为什么会出现这种情况吗?该行为在不同浏览器中似乎是一致的,因此我怀
为什么如果F - 简单函数: F.prototype !== F.__proto__ 但是 Function.prototype === Function.__proto__ ? 最佳答案 F.pro
obj.prototype.__proto__ = events.EventEmitter.prototype 我有时会看到上面的代码,我用谷歌搜索了一下,他们说这一行将所有 EventEmitter
曾经能够毫无问题地做到这一点: for (data in dataArray) { // do some stuff }; 现在,它突然迭代这个 __proto__添加到我的 dataArray 的数
我正在阅读 __proto__ 和 prototype 对象之间的区别,但是当我尝试访问 __proto__ 的实例时一个对象,它返回给我 undefined。 下面是我写的代码: function
当一个对象被实例化时,无论是字符串/函数/等等,__proto__属性(property)包括在内。该属性似乎是由 __proto__ 生成的Object.prototype 中的访问器... Obj
__proto__ 已弃用。为什么像谷歌浏览器这样的大型浏览器仍在使用它?有没有计划倾倒它? 最佳答案 在语言/框架中最难做的事情之一实际上是删除已弃用的功能。世界上仍然有大量代码依赖于此功能。删除它
function makeAdder(x) { return function(y) { return x + y; }; } var add5 = makeAdder(5); add
我正在重新从头开始学习 JavaScript/做个人笔记,并遇到了一些我想要一些解释的东西。 谁能解释一下: Object.prototype.hasOwnProperty("__proto__");
下面是一些示例,展示了基于对象定义和创建方式的原型(prototype)继承的不同行为。我区分对象的“原型(prototype)属性”,例如someObject.prototype 和“原型(prot
我正在尝试使用带有继承的揭示模块模式。我似乎让它工作正常,但它使用“__proto__”,我知道它被认为已被弃用。有没有更好的方法来创建继承而不使用“__proto__”? var Person =
函数getBooks已在Author.prototype中定义。但它不能在 Author 对象中使用。当我使用 __proto__ 继承 Person 属性时。为什么Author对象没有getBook
我有这个功能: 函数 Foo(){} 根据这张图片: >> Foo.prototype -> Foo {} 所以如果我写: Foo.prototype.constructor 现在 - 它引
什么时候 __proto__ 有用? 很多浏览器都支持它,但由于不是所有浏览器都支持,所以程序员似乎害怕使用它。我从未在任何代码中看到它(例如库 jQuery 和 backbone.js)。 什么时候
当我创建一个空白对象时: var o = {}; 为什么新建对象时看不到'__proto __'对象,但添加函数时可以? 编辑:为了完整起见,要创建一个真正的空白对象(没有原型(prototype)链
Object.each , Object.keys , ... 当我尝试与作为类属性的对象一起使用时无法正常工作,请检查 this example : var map = {a: 1, b: []};
在 __proto__ 周围使用方括号时在一个对象中,__proto__是可枚举的。未提供方括号时,__proto__是不可枚举的。 例子: obj = {"__proto__": "Hello"}
我是一名优秀的程序员,十分优秀!