如何在没有类的情况下生成对象的新实例?

2023-12-02

问题:

如何从该类的实例生成该类的新实例?

我发现了什么:

考虑下一个类及其实例:

// Create a new class
var Foo = function Foo () {
  console.log('New instance of FOO!');
};

Foo.prototype.generate = function(first_argument) {
  this.arr = [1,2,3,4,5];
};

var foo = new Foo();

foo.generate();
console.log(foo.arr); // [1,2,3,4,5]

注意foo是作为一个实例Foo,我将在示例中使用此实例。

对象.创建

使用 Object.create 我可以生成 foo 实例的新副本,但它们将共享状态数据:

var bar = Object.create(foo);
console.log(bar.arr); // [1,2,3,4,5]

bar.arr.push(6);
console.log(foo.arr); // [1,2,3,4,5,6]
console.log(bar.arr); // [1,2,3,4,5,6]

如果某些逻辑位于构造函数中,则不会调用它。

原型继承

这与对象创建类似,但它调用构造函数。它仍然存在相同的状态数据问题:

var Bar = function () {
  foo.constructor.call(this);
};

Bar.prototype = foo;

var bar = new Bar();
console.log(bar.arr); // [1,2,3,4,5]

bar.arr.push(6);
console.log(foo.arr); // [1,2,3,4,5,6]
console.log(bar.arr); // [1,2,3,4,5,6]

火狐原型

这是我真正想要做的一个例子,但它只适用于 Firefox:

// Create Bar class from foo
var Bar = foo.constructor;
Bar.prototype = foo.__proto__; // Firefox only

这里我有 Bar 类,它是 Foo 类的副本,我可以生成新实例。

var bar = new Bar();

console.log(bar.arr); // undefined

bar.generate();
console.log(bar.arr); // [1,2,3,4,5]

有没有其他方法可以实现在所有浏览器中都有效的相同目标?


1) proto由于明显的原因必须避免,您可以使用 Object.getPrototypeOf 以标准方式读取对象的原型。
2)你没有构造函数来完成所有的工作,而是有一种带有generate的init方法。 因此,在构造函数末尾调用 this.generate 会更有意义。 这就是原型继承不起作用的原因:构造函数不起作用。 同样的想法,你不能责怪 Object.create 因为它既不构造函数,也不在你的示例中生成,所以你基本上构建了一个具有相同原型的对象,仅此而已。

如果您确实向构造函数添加了对 this.generate 的调用,也许最简单的方法是使用 foo 的构造函数属性来构建一个新对象:

var bar = new foo.constructor();

这会给你一个全新的项目。

所以回答你的问题:是的,还有另一种方法,使用对象实例的构造函数属性来构建一个新项目。

但是没有继承方案能够“猜测”应该使用这样那样的方法来执行完整的初始化。初始化是构造函数的工作。例如,我们可能会想象您构建了一个新数组this.arr = [];在构造函数中,并且generate()将push()该数组中的项目,这将是一种有效的方法。但是,为了优化和清晰起见,您必须避免通过方法添加属性:在构造函数中设置所有实例属性,也许还有原型上的共享属性,并且仅在方法中使用这些属性。

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

如何在没有类的情况下生成对象的新实例? 的相关文章

  • createHTMLNotification() 替换

    我创建了一个 Chrome 扩展程序 其中使用createHTMLNotification 在所有内容之上显示一个窗口 然而 从 Chrome 28 开始 谷歌决定放弃createHTMLNotification 完全 为什么 谷歌 为什么
  • 使用本地存储在从另一个表保存的 HTML TABLE 中打印 JSON,以便我在另一个页面上打印我的表

    在我的作业中 我必须使用用户输入中的数据并将数据保存在本地存储中 我必须以水平表格式将这些数据从本地存储打印到其他页面 为此 我编写了用于用户输入并将数据保存在本地存储中的代码 div p p div
  • 位置特征检测:固定

    我正在尝试找到一个脚本来检测设备是否放置position fixed元素相对于视口而不是整个文档 目前 标准桌面浏览器和 Mobile Safari 适用于 iOS 5 都是这样做的 而 Android 设备则相对于整个文档放置固定元素 我
  • 如何在没有 jQuery 的情况下删除 Javascript 中的元素

    我试图通过以下方式从 DOM 中删除 Div a 标签嵌套在其中 我想我正在寻找的是 jQuery 的纯 Javascript 版本 div remove 这是html设置 div a href Click me to remove the
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 程序集调用堆栈 - 术语问题

    我对 Assembly 完全陌生 希望确认以下陈述中我有误解并需要纠正的地方 堆栈指针 ESP 指的是栈顶 最低内存地址 基指针 EBP 用于在构建堆栈帧时临时存储各种内存地址 它通常保存当前堆栈帧的最高内存地址 指令指针 EIP 指的是内
  • 如何在xcode中的表视图中显示json数据

    我是 ios 新手 目前正在使用 json 我只是使用要在表格视图中显示的 iTunes 前 10 名专辑我收到了格式化并在表格视图中显示的数据 但我只能显示专辑名称 但我想显示要在其中显示的特定专辑的所有详细信息同一个细胞 这是我的完整代
  • HTML 元素在使用 jquery 时不会淡出

    我有一个小型网络项目 您可以在这里看到 http seegermattijs be pickone 当您插入两个项目时 选择一个按钮应该淡入 不幸的是它不会淡出 我使用以下代码 bigBtn fadeIn slow 一开始我让 bigBtn
  • 具有独立 where 子句的多列 - SQL Pivot?

    是否可以采用以下方式构建的表格 ID Month Info1 Info2 1 1 A B 1 2 C D 1 3 E F 2 3 G H 2 4 I J 最终形成这样的表格 ID JanInfo1 JanInfo2 FebInfo1 Feb
  • 如何运行所有 Ruby 脚本并出现警告?

    通过修改 Unix 或 Windows 环境变量 如何始终在默认情况下打开警告的情况下运行 Ruby 脚本 理想情况下 即使我间接运行脚本 例如通过 Rake 这也应该起作用 而不仅仅是直接运行脚本时 基于评论这个答案 The RUBYOP
  • 简单的“Hello World”风格的程序在执行开始后很快就会关闭

    我正在通过一本叫做 C 的书学习 C C 初学者指南第二版 当我运行可执行文件时 它会显示它半秒钟并关闭它 我在 Windows 8 1 上使用 Microsoft Visual Studio Express 2013 for Window
  • 如何在 XAML 中将 List 作为 ItemSource 绑定到 ListView?

    我正在学习 WPF 希望有一个类似于 LinkedList 的集合 以便我可以在其中添加和删除字符串 我想要一个ListView通过数据绑定监听该集合 我怎样才能将一个简单的列表集合绑定到ListView在 XAML 中 我的想法 不起作用
  • 从当前目录执行命令,不带点斜杠,如“./command”

    我觉得我错过了一些非常基本的东西 所以如果这个问题很迟钝 我很抱歉 自从我使用 bash shell 以来 我就一直在努力解决这个问题 假设我有这样的结构 bin command executable 这将执行 bin command 然后
  • 如何比较整数与整数数组

    我是安卓新手 我想知道如何比较整数和整数数组 有一组整数数组 Ex array int 1 2 3 4 和单个整数int i 2 这里我想比较这两个整数 如果单个整数出现在数组整数中 我想要打破这个过程 for i 0 i
  • 网格列数据在语义 UI 反应中重叠?

    https codesandbox io s m3ljr4zl8p example js 我没想到第 1 列数据会开始重叠到第 2 列数据中 而不是下降 因为它现在超出了网格列宽度 解决这个问题的办法是什么 列不重叠 是你的 p 元素比列占
  • Github Actions - 一个操作完成后触发另一个操作

    我有一个动作 ayaml文件 用于将 docker 映像部署到 Google Cloud Run 我希望收到告知构建和推送结果的 Slack 或电子邮件消息 构建操作完成后如何触发消息操作 是否可以获得构建操作的结果 有 2 个选项可以执行
  • 在 SAS 中按条件查找 2 个数据集之间的匹配项

    我正在尝试通过我的同学和我在使用 SAS 的编程课程中使用的 jsl 文件中现有的 for 循环来提高处理时间 我的问题 SAS 是否提供可以复制搜索和匹配条件的 PROC 或语句序列 或者一种浏览未排序文件而不逐行查找匹配条件的方法 我们
  • 在 PhantomJS 中评估似乎不起作用

    我对 JavaScript 魔法有疑问 当我执行这段代码时 var page require webpage create var url http google com page open url function status if s
  • 同一对象的哈希值不同,Swift,Hashable

    里面的Hashable我们可以看到 Hash values are not guaranteed to be equal across different executions of your program Do not save has
  • 从最后一行开始搜索 mysql 表

    所以 我知道关系数据库上不存在 最后一行 这样的东西 但我找不到更好的词来解释我想要做什么 我有一个如下所示的表 其中id is an AUTO INCREMENT场和time是当前的 Unix 时间戳 请注意 我可以为不同的行使用相同的时
  • Python 生成器表达式括号奇怪

    我想确定列表是否包含某个字符串 因此我使用生成器表达式 如下所示 g s for s in myList if s myString any g 当然我想内联它 所以我这样做 any s for s in myList if s myStr
  • Swift 上的常见 Equatable 类

    我需要容器Any Equatable中的项目NOT Generic类 例如故事板中初始的 UI 类 我需要这样 var items Equatable 但它不起作用 Equatable need Generic 不存在共性的问题Equata
  • Sharepoint 2013:通过 REST API 确保用户

    我正在尝试通过 REST API 自动确保某些用户 我的 REST 通话 ajax url blablabla api web ensureuser type POST data logonName i 3A0 23 w 7Cdomain
  • 从 WCF 服务公开枚举的 DescriptionAttribute

    如何使用 WCF 将服务中的枚举值中的描述属性暴露给客户端或 Web 引用 或者 如何使用 WCF 向客户端公开带有描述属性的枚举 虽然公开描述属性不公开 但客户端中仅公开枚举值 我想要枚举中描述属性的值 您不能强制执行此操作 mex WD
  • 如何在没有类的情况下生成对象的新实例?

    问题 如何从该类的实例生成该类的新实例 我发现了什么 考虑下一个类及其实例 Create a new class var Foo function Foo console log New instance of FOO Foo protot