- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道两种继承函数构造函数的方法。
选项 1 Object.create
function x(x, y) {
this.x = x;
this.y = y;
}
x.prototype.XDD = function() {};
function y(c, r) {
x.call(this, 1, 2);
this.r = r;
this.c = c;
}
y.prototype = Object.create(x.prototype);
y.prototype.YDD = function() {};
y.prototype.XDD = function() {};
y.prototype.constructor = y;
var rect = new y(1, 2);
选项 2 Object.setPrototypeOf()
function x(x, y) {
this.x = x;
this.y = y;
}
x.prototype.XDD = function() {};
function y(c, r) {
x.call(this, 1, 2);
this.r = r;
this.c = c;
}
y.prototype.YDD = function() {};
y.prototype.XDD = function() {};
Object.setPrototypeOf(y.prototype, x.prototype);
var rect = new y(1, 2);
它们之间有什么区别?。还有比这些更好的解决方案吗?。
最佳答案
根据 MDN docs :
Changing the [[Prototype]] of an object is, by the nature of how modern JavaScript engines optimize property accesses, currently a very slow operation in every browser and JavaScript engine. In addition, the effects of altering inheritance are subtle and far-flung, and are not limited to simply the time spent in the Object.setPrototypeOf(...) statement, but may extend to any code that has access to any object whose [[Prototype]] has been altered.
Because this feature is a part of the language, it is still the burden on engine developers to implement that feature performantly (ideally). Until engine developers address this issue, if you are concerned about performance, you should avoid setting the [[Prototype]] of an object. Instead, create a new object with the desired [[Prototype]] using Object.create().
性能比较(2019 年 2 月 14 日): https://gist.github.com/calebmer/c74e2a7941044e5f28b8#gistcomment-2836415
简而言之,当极度 规模更大。
在 JS 中设置对象的原型(prototype)还有许多其他方法(例如不推荐使用 Object.prototype.__proto__
),但如今(2019 年 10 月)最推荐的方法似乎是使用 ES6 class
,supported大多数现代浏览器。虽然有基准(如:this)表明 ES6 类和 super()
比对应的 ES5 慢,但它使您的代码更清晰,尤其是对于使用其他 OOP 语言的人而言。
关于javascript - 扩展 Object.setPrototypeOf() 与 Object.create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58377377/
MDN 暗示使用 .setPrototypeOf() 会对代码的 future 性能产生不良影响。 我还阅读了一些关于为什么更改对象的 [[Prototype]] 会降低性能的问题。但是没有一个答案真
因此,我一直在快速了解 JavaScript 的一些新功能,并且一直在阅读有关 Object.setPrototypeOf() 的内容。我从 MDN 中遇到了这段代码它处理从常规对象继承。但是我对他们
所以我读了一些关于 subclassing Array in JavaScript 的博客文章、SO 线程和其他讲座。关于该主题的普遍观点是,没有办法创建具有某种缺点的子类。 在尝试一些事情时,我自己
我正在阅读express 4的源代码,它是相当新的,其中有以下代码: var proto = module.exports = function(options) { var opts = opt
我读了here我们可以使用Object.create来实现继承 这是一个继承自 Shape 的 Rectangle 示例 function Shape() {} function Rectangle(
我想实现 polyfill Object.setPrototypeOf,如下所述: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Re
我有以下代码确保 Promise.reject 返回一个实际的错误对象: export const rejectWithAnError = function(error) { if(error.c
我一直在研究一种类似 ORM 的方法来在 Node.JS 应用程序中处理我的模型,我对它的工作方式很满意;但是,我想知道是否有更好的方法来处理重置构造函数原型(prototype)的问题。 我想要的行
显然使用 __proto__ 属性仍然是操作原型(prototype)链的主要方式,尽管这不符合标准并且 IE 不支持它。虽然您也可以通过使用 new 构造函数构造继承,但与 __proto__ 属性
我只是想知道替换 __proto__ 的主要原因是什么功能 getPrototypeOf/setPrototypeOf ? 提前致谢 最佳答案 MDN explains it pretty well.
当我阅读 MDN( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Sub_classing_wit
我知道两种继承函数构造函数的方法。 选项 1 Object.create function x(x, y) { this.x = x; this.y = y; } x.prototype.XD
MDN 有一个关于修改代码原型(prototype)的巨大警告: Changing the [[Prototype]] of an object is, by the nature of how mo
我正在尝试使用 Object.setPrototypeOf 来重新设置已转换为 JSON 并返回为对象的对象的原型(prototype)。但是,instanceof 似乎没有按我预期的方式工作: cl
让我们考虑以下代码, let f = function () { this.a = 1; this.b = 2; } let o = new f(); f.prototype.c = 3;
我读了一篇关于在类层次结构中保持数据私有(private)的文章 here .我这样做的方式不同。我将工厂函数与 Object.setPrototypeOf(obj, prototype) 一起使用.
我不确定标题是否真的有意义,但我正在尝试将函数原型(prototype)设置为“子类”原型(prototype)。 举个例子; 我尝试做的是:我有一个 user 和 paidUser 。 paidUs
我有一个 Node.js 项目,其中有我自己的自定义错误: 'use strict'; require('util').inherits(module.exports, Error); functio
我有一个 Angular 应用程序,它运行良好。但是,在使用 yarn upgrade 升级依赖项后,我收到了这个神秘错误: main.bundle.js:6779 Uncaught TypeErro
假设我有一个具有speak 功能的动物对象: function speak() { console.log(this.sound) } let animal = { speak } 我有一只狗
我是一名优秀的程序员,十分优秀!