问题标签 [object-create]

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 回答
2861 浏览

javascript - 使用 Object.create 创建的 Javascript 数组 - 不是真正的数组?

它看起来像用 Object.create 创建的数组像数组一样行走,像数组一样嘎嘎,但仍然不是真正的数组。至少使用 v8 / node.js。

一些 Javascript 大师可以解释为什么会这样,以及如何使我新创建的数组与真实数组无法区分吗?

我的目标是克隆数据结构,包括可能附加了自定义属性的数组。当然,我可以使用 手动将属性附加到新创建的数组Object.defineProperty,但是有没有办法使用Object.create

0 投票
4 回答
1969 浏览

javascript - 带有 Object.create 和命名构造函数的原型 OO

我是从 Python 和 Smalltalk 的背景开始接触 Javascript 的,我很欣赏 Self 和 Lisp 在语言中的传承。使用 ECMAScript5,我想在没有 new 运算符的情况下尝试原型 OO。

约束:

  • 用于创建类的可选 new 运算符
  • instanceof 的原型链必须正确
  • 用于 WebInspector 调试支持的命名构造函数
  • alloc().init() 创建序列,如 Objective-C 和 Python

这是我为满足标准而进行的实施尝试:

它似乎在一个简单的模型中工作:

使用类作为工厂函数:

或使用 new 运算符:

我是否在我的实现中忽略了原型 OO 所需的功能?是否有我应该更改的 Javascript 约定或交互?总之,这里的“陷阱”是什么,有什么明显的改进吗?

我想成为具有构造函数定义的 DRYer,但我发现函数的 name 属性不可写,这就是支持 WebKit Inspector 的对象名称的原因。我能够构建一个 eval 来完成我想要的,但是......糟糕。

0 投票
1 回答
341 浏览

javascript - Javascript object.create 和 isPrototypeOf

我试图了解 object.create 以及如何最好地使用它,避免使用构造函数new关键字。到目前为止,我正在按上述方式接近它(尽管可能不是最好的方法,只是反复试验) - 并且发现如果我使用object.create我不再能够检查instanceof和对象类型。

有人建议使用 isPrototypeOf 来检查 - 我做错了,因为我上面的代码false在检查时返回。

有人会好心解释我哪里出错了吗?我对 javascript 中的原型继承仍然很陌生。

0 投票
1 回答
3564 浏览

javascript - 访问使用 Object.create 创建的 JavaScript 属性的 get/set 方法

我想要的是能够包装一个 JavaScript 属性来修改 get/set 上的行为。

对于作为值的属性,我可以执行以下操作:

但是,如果myProperty已经有一个 getter/setter 怎么办?

有没有办法检测myProperty匿名设置器,以便我可以在notifyOfChange中调用它?

注意:我想让 notifyOfChange 与任何对象一起工作,因此仅对myProperty设置器使用命名函数是行不通的。

0 投票
2 回答
660 浏览

javascript - Javascript 私有变量 + Object.create(引用闭包变量)

我想知道如何通过 clojure 在 javascript 中创建私有变量。但是在使用Object.create时仍然会克隆它们。

我从http://ejohn.org/blog/ecmascript-5-objects-and-properties/获得了这种技术,但它有这个限制,即所有对象的闭包变量都是相同的。我知道 javascript 上的这种行为是应该的,但我怎样才能创建真正的私有变量?

0 投票
5 回答
5822 浏览

javascript - 了解 Crockford 的 Object.create shim

我一直在阅读 Crockford 垫片以防止覆盖原型,并了解它有时不是最终/全部解决方案。我也明白ES5 Shim可能是一个可行的替代方案。我还阅读了这篇文章,它提供了更强大、更安全的替代方案

尽管如此,我还是想知道他的Object.create垫片在“说”什么,然后“在做什么”。有人可以告诉我我的解释评论是否正确吗?

这样,当我们将东西扩充到“another_stooge”时,“stooge”对象的原型就不会被覆盖。无需使用 'constructor' 重置 'stooge' 原型。

提前致谢,

-k

0 投票
3 回答
786 浏览

javascript - 为什么 Object.create 使我的私有变量变为静态?

代码可在此处使用 - http://jsfiddle.net/dsjbirch/zgweW/14/

这基本上是对私有变量的 crockfords 解释的直接复制和粘贴。

我已经添加Object.create()了一些跟踪。

为什么第二个对象共享第一个对象的私有成员?如何避免这种情况但继续使用Object.create()

http://jsfiddle.net/dsjbirch/zgweW/14/

我希望看到

但实际上第二个对象的输出都是空的。

我的结论second是因此共享first对象的secret成员。

0 投票
1 回答
1371 浏览

javascript - Object.create 原型链

最初的问题

昨天我读到了 ECMAScript 5 Object.create() 我想用这个方法开始在我的代码中构建原型链,而不是设置原型及其构造函数,我喜欢你可以直接设置可写可配置等。

我试过这样

  • 中给出的方法是否Human仅在 ram 中存在一次?并Human1.walk()指向它?
  • 我想知道这是否是这样做的正确方法?我对 JavaScript 比较陌生。

这是jsfiddle上的代码。

回答

首先,这让事情变得更加清晰 =) 但是,1:当我这样做时,实例从其构造函数的原型继承(?)

2:所以 instanceof 运算符不会在此代码中中断,(它仅适用于函数对我来说似乎很清楚)

但是这样写,Paul 仍然从​​ Top 的原型继承了 inherit() 方法,我需要覆盖它但是如果我不希望 Human 的实例继承该方法,我该怎么做呢?

除了使用 Objkect.defineproperty (?) 之外,我无法设置像 wrtable 这样的属性描述符

那么使用 Object.create() 从 Objects 继承与设置原型和构造函数的主要好处是什么?=)

3:哦,谢谢,是的,这是正确的,这不是基础对象的扩展=)谢谢建议=)

感谢所有的努力 =)

回答

好的,所以当我这样做时

没有={}

base.prototype = 没有;

这不会阻止原型链向上直到 Object.prototype 吗?如果没有,有没有办法做到这一点?=) 会 ( Object.create(null); ) 这样做,

我认为我必须设置

base.prototype.constructor = base;

因为否则,原型的构造函数

var Top = new base();

如果原型设置为 Nothing ->

Top instanceof base // false

更新

我现在以这样的方式结束了它:

只是如果有人关心
但是,jsfiddle 不会运行它,Titanium 会按预期执行所有操作,也许是某种严格模式(??)

0 投票
1 回答
898 浏览

javascript - JavaScript 继承 Object.create

好的,我正在尝试跟踪对 Web 应用程序上的巨大表单所做的任何更改。加载页面时,我创建一个 JS 对象,它“捕获”所有输入字段(选择、单选按钮、复选框等)的初始状态。
当用户改变数百个输入元素中的任何一个的值时新值将在第二个对象中进行跟踪。当用户点击Update时,这两个对象会进行比较,并且只发送那些已更改的值,以相应地更新数据。

我认为使用继承是明智的,而不是构建 2 个完全独立的对象:

随着事情的发展,tracker对象可能最终看起来像这样:

在 FF 和 chrome 中调用JSON.stringify这个对象时,一切都很好:只返回对象自己的属性。在 IE 中不是这样:跟踪器没有prototype属性,所以看起来会Object.create创建副本而不是继承链?
tracker.__proto__ === initialState返回 true,而tracker.prototype === initialState计算结果为 false,实际上该tracker.prototype属性是未定义的。

问题1:是否有另一种方法可以在 IE 中设置继承链,让我剥离未更改的原型值?

问题2:我还想要一种方法——如果可能的话——建立一个允许嵌套对象的继承链。就像现在一样,嵌套对象是通过使用递归函数迭代主对象来处理的。有点傻,因为那是我想省略的。

简而言之:
我想知道这是否存在:

与往常一样:没有 jQuery 标签,意味着没有 jQuery
注意:我所说的 IE 是指怪物 IE8,而不是 IE9(可悲的是公司政策)

0 投票
2 回答
1853 浏览

javascript - javascript中的Object.create方法

作为 javascript 的初学者,我试图从这里理解 Object.create() 方法

https://developer-new.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

在示例代码中,第 18 行。创建了一个访问器属性,并将 writable 设置为 true。我还读到可写仅适用于数据描述符。

试过跑步,

我明白了invalid property error