问题标签 [defineproperty]

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

javascript - “使用严格”和只读属性的奇怪行为

在 MDN 严格模式参考页面上它说

任何在正常代码中静默失败的赋值(赋值给不可写属性、赋值给 getter-only 属性、赋值给不可扩展对象的新属性)都将进入严格模式

因此,使用他们的示例,执行以下操作会引发 TypeError

然而,我遇到了一个例子,似乎“使用严格”对这条规则有点过分热心。这是我的设置

定义lol.js

setlol.js

应用程序.js

跑步node app.js

这个输出有几个有趣的地方。首先是我们不是在尝试设置lol属性,Object.prototype而是在尝试设置 的lol属性verbose。为了证明这一点,我变成definelol.js

现在,跑步node app.js

有趣的第二件事是原始程序失败verbose.lol = '123'但非常高兴创建sugar并将其设置lol为 123。我不明白这一点,因为似乎我们创建的方式sugar应该只是我们创建方式的语法糖verbose

0 投票
4 回答
21603 浏览

javascript - 如何“覆盖”原型上定义的(获取)属性?

我有一些代码在原型上定义了一个 getter(但没有 setter,如果相关的话)。返回的值在 99.99% 的情况下是正确的;但是,目标是将要评估的属性设置为特定对象的不同值。

如何覆盖现有对象 x 的属性,使其可分配(例如,具有默认属性行为)?

附录:虽然可以在 x 上定义新属性(值或 get/set),但我正在寻找是否有办法停止[prototype] 中属性的行为并将“bar”恢复为正常/ad特定实例的 -hoc 属性。

0 投票
4 回答
3393 浏览

javascript - 访问 JavaScript 对象的默认 getter/setter

JavaScript getter 和 setter 可以使用Object.defineProperty. 有什么方法可以访问默认的 getter/setter(即,如果 getter/setter 没有被覆盖,则使用的函数)?在我的自定义设置器中,我希望在某些情况下进行特殊处理,但在其他情况下使用默认处理。我试过了:

不幸的是,这会导致堆栈溢出,因为obj['foo'] = val;会导致调用自定义设置器。所以我想找到一种方法来设置使用默认设置器的foo属性。obj这可能吗?

0 投票
1 回答
995 浏览

javascript - Object.defineProperty 和返回值

我正在玩一个 javascript 对象,该对象使用 Object.defineProperty 方法定义了一些 getter 和 setter。

对于其中一个属性(id),我只想要一个吸气剂。最初我有一个错字,它正在返回 的值_username,但我很快意识到上述方法不起作用。只是出于好奇,我试图理解为什么它没有按预期工作。如果我做了以下事情:

最后一条语句将 alertundefined而不是bob. 这是为什么?有没有办法让它返回另一个财产?

0 投票
2 回答
1028 浏览

javascript - 如何向 HTMLElement 添加自定义属性,该属性将默认为元素的每个新实例上的空对象?

如果我向 的原型添加一个新属性HTMLElement,并且其默认值为 ' {}'(一个空对象):

现在我创建一个新的div(也是一个HTMLElement):

customObject我为of分配了一个属性e

如果我提醒它,我会看到所需的值:

现在我创建一个新的、不同的div元素:

d现在应该有一个空customObject属性,对吧?

但是,如果我提醒它:

我得到了这个意想不到的结果:

怎么来的?当我创建一个新元素时,它不应该有一个 HTMLElement.prototype 的“空白”实例吗?

(jsfiddle:http: //jsfiddle.net/5pgr38mb/

编辑: 我正在寻找一种适用于深度克隆的解决方案 cloneNode(true))。含义 - 如果自定义对象在元素或其任何子项上具有属性,则该元素或子项将在克隆实例中保留其值(这是“本机”HTMLElement 属性的正常行为)。

0 投票
1 回答
1844 浏览

javascript - 如何定义使用 getter 和 setter 生成对象的构造函数?

我正在创建一个对象定义来封装几个属性。我对这个对象有 4 个要求:

  • 任何时候都可以创建多个实例
  • 只能设置/获取对象上定义的属性
  • 该对象必须是可字符串化的(只是属性和关联值)
  • 字符串化版本必须是可解析的并返回对象

这是我到目前为止的简化版本:

我不确定这是否是使用 getter 和 setter 定义对象的最简单方法。有没有使用的替代方法Object.defineProperty,或者这是新规范?

这种方法还需要我编写自己的stringify方法(见下文),因为调用JSON.stringify将剥离函数,而这将剥离make. 有没有写我自己的替代方法?我可以以某种方式更改我的对象定义吗?

此外,我必须提供一个可选的构造函数 arg 才能Car从 JSON 对象实例化 a:

同样,这是满足所有要求的最佳方法吗?

0 投票
2 回答
59 浏览

javascript - 取消设置并为使用 defineProperty 定义的属性设置新值

我用 定义了一个对象属性Object.defineProperty。但那我怎么能取消它呢?

我试图用delete foo.barbar属性在哪里)来取消它,但它似乎不起作用:

输出是:

我期望以下输出:

这个想法是,在第一次之后,get我想用一个值替换该属性。

如何才能做到这一点?

0 投票
1 回答
197 浏览

javascript - 对象值的Javascript设置器

我创建了一个“set”函数,它将在我的对象“myObject.user”的值更改期间触发。因此,当我更改值时,我会变得警觉。但是当我更新对象“myObject.newuser[0].id”中的值时,该集合没有调用。如何更改代码,以便如果更改任何内部值,则全局集应该可以工作。即对于这段代码,我应该得到两个警报。

0 投票
1 回答
510 浏览

javascript - 如何同时为对象的所有属性定义属性(或设置默认值)

我正在编写一个 AngularJS 服务提供者(函数):

  • 从 SQLite 数据库的多个不同表中获取结果
  • 将对象返回给各种控制器函数

该服务查询不同的表(具有不同的列),因此result对象具有不同的属性 - 取决于数据来自哪个表。

  • 因此无法Object.defineProperties用于特定的对象属性,因为在创建查询“案例”之前我不知道属性
  • 我想我可以在“开关”中定义对象变量属性,但这看起来很乱......

当对象返回到控制器函数时,需要进行一些操作

  • 我需要能够覆盖返回对象中的一些属性(即需要writable: true
  • 准确地说, JSON.parse() 然后覆盖各种属性,因为存储在 SQLite DB 中的数组在 INSERT 之前用 JSON.stringify() 转换,然后作为字符串存储在 DB 中
  • 我遇到了麻烦,因为对象的默认值是writable: false

问题:
我如何定义一个对象以具有对象configurable: true, writable: true, enumerable: true的所有(未来)属性的属性? 即如何设置对象的默认属性,因为我(还)不知道对象的确切属性名称?

示例代码:

PS代码工作正常,但只返回一个对象,writable: false, enumerable: true, configurable: false而我需要一切true

编辑:
即使在下面的部分解决方案之后仍然存在问题:
- 为什么不能使用该Object.defineProperty方法手动更改属性描述符?
- 为什么enumerable: true默认值应该是 false ?这与 SQlite 数据库事务有关吗?
- 为什么默认值writable: false, enumerable: false, configurable: false不应用于使用 JSON 方法克隆的新对象?
答案这里- 取决于对象的创建方式 - 请参阅下面的评论

0 投票
2 回答
188 浏览

javascript - 如何在不将属性应用于 Number.prototype 的情况下将属性添加到 Object.prototype?

我的目标是创建一个master_script.js。主要用于开发的处理程序文件。

该文件的一个小节专门用于自定义基础对象的原型:

  1. 细绳
  2. 数字
  3. 大批
  4. 目的
  5. 日期
  6. 功能
  7. 布尔值

所以当我写出我的代码块时......

工作正常!

  • 当我n.__proto__控制台中展开时,它会显示len: (...)属性及其 getter 函数get len: function (){
  • 当我n.控制台中输入时,它在属性列表中清晰可见|方法。

当我为o变量配置相同的设置时,问题就开始了:

我注意到的第一件事是,当我现在在控制台n.中输入或o.输入时,属性|方法的弹出列表不再包含对该属性的引用,但是如果我输入完整的扩展名或者我得到所需的结果or ...lenn.leno.len32

所以我知道代码是合法的,但我需要控制台弹出窗口,因为 7 个基础对象中的每一个都有大约 40 种不同的属性和方法......

所以我写了一个测试块来尝试和识别问题:

立即在控制台中扩展.__proto__,nowone我注意到所有 3 个都被赋予了dis我最初尝试分配给该o对象的属性。

然后我破解了它:Number.prototype它本身就是一个对象,所以它继承了它的dis属性Object.prototype

如何将dis属性仅附加到o对象而不被nfrom继承Object.prototype