问题标签 [prototypal-inheritance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
276 浏览

javascript - 在javascript中实例化一个对象真的只是以某种方式继承吗?

我正在阅读一本 JavaScript 书籍,并且在阅读有关继承的一章时,我想知道是否每次创建对象的实例时都会发生继承,尤其是因为它们是相似的。

示例:原型链接 -someObject.prototype = new someOtherObject();

实例化一个对象var myArray = new Array()

类似吧?

此外,这本书(面向 Web 开发人员的 JavaScript,作者:Nicholas Zakas)指出,实例和构造函数的原型之间存在链接。(该链接通常称为__proto__

那么有人可以说实例化一个对象就像继承吗?

0 投票
1 回答
2142 浏览

javascript - 在 Backbone.js 中,如何让模型超类默认值充当子类的默认值?

我有一个定义一些默认值的类,以及一个定义一些默认值的子类。但是当我创建子类的实例时,它只查看本地默认值,而不会将其默认值与父类的默认值合并。是否有任何简单的方法可以做到这一点,而无需在initialize每个子类的函数中显式地将本地默认值与父默认值合并?

这输出:

不是我想要的:

0 投票
2 回答
6816 浏览

javascript - 如何在不指定模型名称的情况下从该模型的实例调用静态 Backbone.Model 函数?

我有我想从我的 Backbone.Model 对象的实例访问的静态属性。我知道我可以硬编码父构造函数来调用该方法,但这会阻止我使用多态静态函数。例如,我希望能够foo在必要时覆盖函数ExtendedInventory,而无需更改任何其他代码。

0 投票
3 回答
259 浏览

javascript - 我什么时候想在 JavaScript 中使用“类”(静态)方法或属性?

在 JavaScript 中,为什么要直接将属性附加到构造函数?

在查看 CoffeeScript 的辅助函数后,我得到了这个问题__extend,其中包含以下内容:

它将属性/方法直接从构造函数对象复制到子类对象。但为什么会有人这样做呢?

谢谢!

0 投票
1 回答
336 浏览

javascript - 在 JavaScript (ES-5) 中创建原型链

我正在尝试创建一个使用原型链创建对象的函数,如下所示:

我想包装给定的原型以覆盖他们自己的查找链(以便可以重用它们),并希望以最少的复制/内部属性包装来做到这一点。

Javascript/ECMAScript 5 中是否有任何功能可用于覆盖对象上的所有属性访问?类似于__getattribute__(self, attrname)Python 的东西?如果没有,我该怎么做?我是否被迫只克隆对象的属性(使用Object.hasOwnProperty())?

0 投票
4 回答
4514 浏览

javascript - JavaScript 中的原型 OO

TL;博士:

我们是否需要原型 OO 中的工厂/构造函数?我们可以进行范式转换并完全放弃它们吗?

幕后故事:

最近我一直在玩弄用 JavaScript 做原型 OO,发现用 JavaScript 完成的 99% 的 OO 都在强制使用经典的 OO 模式。

我对原型 OO 的看法是它涉及两件事。方法(和静态数据)的静态原型和数据绑定。我们不需要工厂或构造函数。

在 JavaScript 中,这些是包含函数和Object.create.

这意味着我们可以将所有内容建模为静态蓝图/原型和数据绑定抽象,最好直接连接到文档样​​式的数据库中。即对象从数据库中取出,并通过使用数据克隆原型来创建。这意味着没有构造函数逻辑,没有工厂,没有new.

示例代码:

一个伪示例是:

小解释:

特定的代码很冗长,因为 ES5 很冗长。Entity上面是一个蓝图/原型。任何带有数据的实际对象都将使用Object.create(Entity, {...}).

实际数据(在本例中为组件)直接从 JSON 存储加载并直接注入到Object.create调用中。当然,类似的模式也适用于创建组件,只有通过Object.hasOwnProperty的属性才会存储在数据库中。

第一次创建实体时,它是用空的{}

实际问题:

现在我的实际问题是

  • JS原型OO的开源例子?
  • 这是一个好主意吗?
  • 它是否符合原型 OOP 背后的想法和概念?
  • 不使用任何构造函数/工厂函数会在某处咬我吗?我们真的可以不使用构造函数吗?使用上述方法是否有任何限制,我们需要工厂来克服它们。
0 投票
8 回答
1554 浏览

javascript - (开源)JavaScript 原型 OO 示例

赏金编辑:

我正在寻找以原型 OO 范式(想想 Self)编写的代码。不是原型 OO 和经典 OO 的混合体。我不想看到通用的 OO 包装器,而只是简单地使用原型 OO 技术并且使用原型 OO 技术。

参考相关问题:

JavaScript 中的原型 OO

在上面的问题中,我主要关注的是

可以这样写原型OO吗?

我们是否需要构造函数和初始化逻辑,有哪些替代方案?

新问题:

基本上在大型开源项目中是否有javascript 原型 OO 的好例子?

澄清:

我将不得不澄清原型 OO的含义:

  • 没有课程。只有对象。
  • 类概念的模拟为零同样只有对象和克隆对象来创建新对象。

原型 OO 的进一步说明:

JavaScript 中的原型 OO 与经典 OO 仿真之间的区别是一个非常灰色的区域。这并不是说我重视避免经典的 OO。我想以学术方式自己学习原型 OO,而不学习经典 OO 仿真和原型 OO 的(可能更优化)组合。

这就是我“禁止”类的原因,只是为了让我能够以纯粹的方式看到这些技术并扩展我自己的 OO 工具包。

例子:

像 jQuery 这样的流行示例不符合第二个标准。对象是一jQuery大类仿真。它专注于从类中创建新对象,而不是克隆现有对象。

如果我真的知道使用“纯”原型 OO 的任何示例,我会向您展示。我相信 99% 的 JavaScript OO 受经典仿真的影响太大。

奖励积分

如果

  • 它的评论很好/记录在案
  • 有单元测试
  • 在github上。

我还将接受有关如何编写超出您琐碎的 hello world 应用程序的原型 OO 代码的文章/教程和示例。

0 投票
7 回答
17825 浏览

javascript - 在 Backbone.js 中扩展模型超类的默认值

我想把这个作为这个答案的一个问题,但我似乎不能这样做,我很抱歉。

扩展子类的默认值反映在超类中。这似乎违背了目的,我更倾向于在子类中明确列出超类的默认值以获得我正在寻找的结构。

这输出:

不是我(我认为也不是op)想要的:

0 投票
1 回答
469 浏览

javascript - 在闭包中使用原型模式

我一直在摆弄 Javascript 中的原型和闭包模式。您可能知道,使用闭包模式会降低性能,因为它为对象的每个实例重新定义了相同的函数。然而,闭包模式确实允许私有变量,这使得封装更容易。

这是原型模式的典型示例:

我在想,你为什么不能做这样的事情?

这允许在 foo() 函数中使用私有变量,您甚至可以在 foo() 函数中动态设置原型。

我做了一个jsperf.com 测试,它确实显示了性能上的很大差异,但我不知道为什么。

0 投票
2 回答
159 浏览

javascript - 数组默认没有原型吗?

我希望能够增加Array.prototype方法,然后在任何数组上调用它们:

但似乎数组没有原型......?

我在这里错过了什么吗?


看来我的实际问题出在其他地方:调用[1, 2, 3].customMethod()有效,但调用someDomElement.childNodes.customMethod()失败。是childNodes不是真正的数组?