问题标签 [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.
javascript - “使用严格”和只读属性的奇怪行为
任何在正常代码中静默失败的赋值(赋值给不可写属性、赋值给 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
javascript - 如何“覆盖”原型上定义的(获取)属性?
我有一些代码在原型上定义了一个 getter(但没有 setter,如果相关的话)。返回的值在 99.99% 的情况下是正确的;但是,目标是将要评估的属性设置为特定对象的不同值。
如何覆盖现有对象 x 的属性,使其可分配(例如,具有默认属性行为)?
附录:虽然可以在 x 上定义新属性(值或 get/set),但我正在寻找是否有办法停止[prototype] 中属性的行为并将“bar”恢复为正常/ad特定实例的 -hoc 属性。
javascript - 访问 JavaScript 对象的默认 getter/setter
JavaScript getter 和 setter 可以使用Object.defineProperty
. 有什么方法可以访问默认的 getter/setter(即,如果 getter/setter 没有被覆盖,则使用的函数)?在我的自定义设置器中,我希望在某些情况下进行特殊处理,但在其他情况下使用默认处理。我试过了:
不幸的是,这会导致堆栈溢出,因为obj['foo'] = val;
会导致调用自定义设置器。所以我想找到一种方法来设置使用默认设置器的foo
属性。obj
这可能吗?
javascript - Object.defineProperty 和返回值
我正在玩一个 javascript 对象,该对象使用 Object.defineProperty 方法定义了一些 getter 和 setter。
对于其中一个属性(id),我只想要一个吸气剂。最初我有一个错字,它正在返回 的值_username
,但我很快意识到上述方法不起作用。只是出于好奇,我试图理解为什么它没有按预期工作。如果我做了以下事情:
最后一条语句将 alertundefined
而不是bob
. 这是为什么?有没有办法让它返回另一个财产?
javascript - 如何向 HTMLElement 添加自定义属性,该属性将默认为元素的每个新实例上的空对象?
如果我向 的原型添加一个新属性HTMLElement
,并且其默认值为 ' {}
'(一个空对象):
现在我创建一个新的div
(也是一个HTMLElement
):
customObject
我为of分配了一个属性e
:
如果我提醒它,我会看到所需的值:
现在我创建一个新的、不同的div
元素:
这d
现在应该有一个空customObject
属性,对吧?
但是,如果我提醒它:
我得到了这个意想不到的结果:
怎么来的?当我创建一个新元素时,它不应该有一个 HTMLElement.prototype 的“空白”实例吗?
(jsfiddle:http: //jsfiddle.net/5pgr38mb/)
编辑: 我正在寻找一种适用于深度克隆的解决方案( cloneNode(true))。含义 - 如果自定义对象在元素或其任何子项上具有属性,则该元素或子项将在克隆实例中保留其值(这是“本机”HTMLElement 属性的正常行为)。
javascript - 如何定义使用 getter 和 setter 生成对象的构造函数?
我正在创建一个对象定义来封装几个属性。我对这个对象有 4 个要求:
- 任何时候都可以创建多个实例
- 只能设置/获取对象上定义的属性
- 该对象必须是可字符串化的(只是属性和关联值)
- 字符串化版本必须是可解析的并返回对象
这是我到目前为止的简化版本:
我不确定这是否是使用 getter 和 setter 定义对象的最简单方法。有没有使用的替代方法Object.defineProperty
,或者这是新规范?
这种方法还需要我编写自己的stringify
方法(见下文),因为调用JSON.stringify
将剥离函数,而这将剥离make
. 有没有写我自己的替代方法?我可以以某种方式更改我的对象定义吗?
此外,我必须提供一个可选的构造函数 arg 才能Car
从 JSON 对象实例化 a:
同样,这是满足所有要求的最佳方法吗?
javascript - 取消设置并为使用 defineProperty 定义的属性设置新值
我用 定义了一个对象属性Object.defineProperty
。但那我怎么能取消它呢?
我试图用delete foo.bar
(bar
属性在哪里)来取消它,但它似乎不起作用:
输出是:
我期望以下输出:
这个想法是,在第一次之后,get
我想用一个值替换该属性。
如何才能做到这一点?
javascript - 对象值的Javascript设置器
我创建了一个“set”函数,它将在我的对象“myObject.user”的值更改期间触发。因此,当我更改值时,我会变得警觉。但是当我更新对象“myObject.newuser[0].id”中的值时,该集合没有调用。如何更改代码,以便如果更改任何内部值,则全局集应该可以工作。即对于这段代码,我应该得到两个警报。
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 方法克隆的新对象?
答案在这里- 取决于对象的创建方式 - 请参阅下面的评论
javascript - 如何在不将属性应用于 Number.prototype 的情况下将属性添加到 Object.prototype?
我的目标是创建一个master_script.js。主要用于开发的处理程序文件。
该文件的一个小节专门用于自定义基础对象的原型:
- 细绳
- 数字
- 大批
- 目的
- 日期
- 功能
- 布尔值
所以当我写出我的代码块时......
工作正常!
- 当我
n.__proto__
在控制台中展开时,它会显示len: (...)
属性及其 getter 函数get len: function (){
。 - 当我
n.
在控制台中输入时,它在属性列表中清晰可见|方法。
当我为o
变量配置相同的设置时,问题就开始了:
我注意到的第一件事是,当我现在在控制台n.
中输入或o.
输入时,属性|方法的弹出列表不再包含对该属性的引用,但是如果我输入完整的扩展名或者我得到所需的结果or ...len
n.len
o.len
3
2
所以我知道代码是合法的,但我需要控制台弹出窗口,因为 7 个基础对象中的每一个都有大约 40 种不同的属性和方法......
所以我写了一个测试块来尝试和识别问题:
立即在控制台中扩展.__proto__
,和nowo
后n
,e
我注意到所有 3 个都被赋予了dis
我最初尝试分配给该o
对象的属性。
然后我破解了它:Number.prototype
它本身就是一个对象,所以它继承了它的dis
属性Object.prototype
如何将dis
属性仅附加到o
对象而不被n
from继承Object.prototype
?