Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >动态getter和setters一种可能性

动态getter和setters一种可能性
EN

Stack Overflow用户
提问于 2012-12-12 22:08:43
回答 2查看 2.1K关注 0票数 6

我正在努力解决最近出现在我脑海中的一个问题。假设我们想要并且知道如何在javascript中使用动态的getter和setter,就像在php (__get,__set)中那样。但是由于javascript没有一个通用的属性,我们唯一能做的就是提供一个可能键的列表,然后迭代,只在这些键上添加getter和setter,并希望以后不会再有其他的。

但到目前为止,这个问题还没有得到解决。因此,我想到的下一种方法是对trycatch使用讨厌的技巧,所以任何时候在对象中没有定义名称时,使用catch作为getter (至少),然后恢复代码,这很难,而且可能是毫无意义的事情。但是从这里我的第二个问题来了,在这样的使用中:

代码语言:javascript
运行
AI代码解释
复制
console.log(g.someundefinedproperty); 

结果将是对console.log的调用,显示undefined,没有抛出任何异常。然后我想到:如果我使用原来的window.undefined getter和setter会怎么样呢,毕竟每次我搞砸了,拼错一个单词或什么东西时,都必须调用它。

所以我试着

代码语言:javascript
运行
AI代码解释
复制
Object.defineProperty(window, 'undefined', {
    get : function ()
    {
         // functional code, including getting the caller and figuring out
         // where we are, and what we have to do... easy :D

         console.log('works');
    },
    set : function ()
    {
         // some couple more fine hacks here
         console.log('this too');
    }
});

但不幸的是,window的undefined属性是configurable : false。除了undefined和内部window属性之外,其他黑客还尝试克隆window对象。并在新对象上定义新的undefined (请注意其中的讽刺意味),然后是window = mybetterwindow

由于这没有引起任何问题,我的希望很高,但系统再次让我失望,因为window不能被覆盖,这是设计的。我猜它有自己的getter,并且会根据window.prototype甚至更好的Window.prototype (注意大写字母)中的原型重新实例化自己。

作为我在这个实验中的最后一步,我在这个原型上重新定义了undefined。无济于事,什么也没改变...我尝试创建一个new Window(),但是Window不是一个构造函数,失败!

由于我已经没有想法了,我发现自己在这里写了这篇恳求帮助的文章。如果您有任何想法来解决动态的getters和setters问题,(the existencial problem of life, universe and everything else),以一种不会以任何方式修改...我使用对象的方式(作为奖励,它不会在fabric of time and space中使用hole )或语法,我恳求您发言,否则永远保持沉默:)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-12 22:32:06

,但不幸的是,window的未定义属性是configurable: false

只有在EcmaScript 5.1之后才会出现这种情况。以前,它是可重写的。

如果我使用原始的window.undefined getter和setter怎么办,毕竟每次我搞砸了,拼错一个单词或什么东西时,都必须调用它。

不,它不会起作用的。 value和全局变量"undefined“之间存在差异。不会在每次遇到未定义的值时计算变量(例如,在typeof (void 0)中),只有在显式使用它时(例如,在g.someprop === undefined中)。

有什么办法解决动态的getter和setters问题吗?

只有一个解决方案:Proxies。不幸的是,它只是一个和谐草案,目前只有supported in Firefox' Javascript 1.8.5

另请参阅实现轮询解决方案的Is there an equivalent of the __noSuchMethod__ feature for properties, or a way to implement it in JS?Detect when a new property is added to a Javascript object?How to detect when a property is added to a JavaScript object? (通过setInterval检查更改)。

对于干净的解决方案,您目前必须使用显式的getter函数,您可以传递属性名称(g.get("someundefinedproperty"))。

票数 5
EN

Stack Overflow用户

发布于 2012-12-12 22:33:05

您要完成的任务(任何未定义属性的全局getter )都超出了跨浏览器JavaScript的范围。

最接近的功能是使用__defineGetter__向所有对象添加特定属性:

代码语言:javascript
运行
AI代码解释
复制
var o = Object.prototype;
o.__defineGetter__("testo", function() { return "yo in testo"; });
alert({}.testo);
alert((new Date()).testo);

http://jsfiddle.net/NLCvs/2/

如果您可以提前预测可能未定义的属性的名称,这可能会很有用。即便如此,为一个可能未定义的属性的所有对象添加一个访问器也是相当老套和糟糕的形式。

一个更好的选择是在未定义的属性可能被访问时重构代码:

代码语言:javascript
运行
AI代码解释
复制
function getter(o, n) {
 return typeof o[n] == 'undefined' ? 'some default value' : o[n];
}
var obj = { hello: 'world' };
alert(getter(obj, 'hello'));
alert(getter(obj, 'an_undefined_property'));

更好的选择是使用mixin来设置您需要访问的任何默认属性,例如通过jQuery.extend

代码语言:javascript
运行
AI代码解释
复制
var defaults = {
 required: 'this property is required'
};
var my_object = {
 something_else: 'this is something else'
};
var o = jQuery.extend({}, defaults, my_object);

// o.required === 'this property is required'
// o.something_else === 'this is something else'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13849533

复制
相关文章
css中绝对定位_绝对定位和相对定位怎么用
bottom属性描述时,以首屏页面左下角为参考点 如果浏览器不动,滚动条动的时候,红色盒子跟随页面动,红绿盒子间距不变。
全栈程序员站长
2022/11/17
2.7K0
css中绝对定位_绝对定位和相对定位怎么用
【CSS】绝对定位元素设置 水平 / 垂直 居中 ( 绝对定位元素居中设置 - 先偏移 50% 再回退子元素一半尺寸 | 绝对定位居中设置 )
绝对定位 不能通过 设置 margin: auto; 样式的方式 , 设置盒子模型水平居中 ;
韩曙亮
2023/04/16
3.4K0
【CSS】绝对定位元素设置 水平 / 垂直 居中 ( 绝对定位元素居中设置 - 先偏移 50% 再回退子元素一半尺寸 | 绝对定位居中设置 )
【CSS】定位 ④ ( 绝对定位特点 | 相对定位不脱标示例 | 绝对定位脱标示例 )
如果 绝对定位 的元素 的 父级元素 没有定位 , 那么会 一直向上查找有定位的父级元素 , 直到浏览器 ;
韩曙亮
2023/04/16
1K0
【CSS】定位 ④ ( 绝对定位特点 | 相对定位不脱标示例 | 绝对定位脱标示例 )
水平滚动条
主要用到并排Div 的父级设置white-space: nowrap,并排的div设置display:inline-block;
tianyawhl
2019/07/16
2.6K0
杂谈一:前端设置绝对定位后滚动条失效的解决办法
问题 微信小程序开发中为父元素设置背景图,子元素不能滚动 公共css样式 <style> .fu{ background:url("https://xxx.png"); width:100%; height:100vh; background-size: 100% 100%; background-repeat: no-repeat; z-index: -999; position: fixed; } .zi{ width:70%; height:
用户8988577
2022/12/27
2K0
[iOS] WSHorizontalPickerView 图片水平滚动封装
之前这篇文章传送门本来是记录自己练手的demo的,后来很多人来问我要代码。今天就抽时间封装了一下,没有考虑太多情况,等我有空再去仔细考虑吧。
wOw
2018/09/18
3K0
绝对定位下的盒模型
元素被绝对定位,那么元素将会脱离正常流(normal flow),并依据包含块来定位。包含块的概念及其判定可以看这里。 在负margin的应用一文中,我们提到了一个对于任意一个块元素所形成的框的尺寸的计算公式:   BoxWidth = MarginLeft + BorderLeftWidth + PaddingLeft + ContentWidth + PaddingLeft + BorderRightWidth + MarginRightWidth; 但是在含有绝对定位元素的包含块内,包含块的尺寸却不能
欲休
2018/03/15
8650
WPF 让 TextBox 支持水平滚动
超级简单的方法,只需要设置 HorizontalScrollBarVisibility 可见就可以了
林德熙
2022/08/12
9840
css绝对定位与相对定位结合使用_css定位方法
绝对定位使元素的位置与文档流无关,因此不占据空间。这一点与相对定位不同,相对定位实际上被看作普通流定位模型的一部分,因为元素的位置相对于它在普通流中的位置。 相对定位是一个非常容易掌握的概念。如果对一个元素进行相对定位,它将出现在它所在的位置上。然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动。—(w3cSchool)
全栈程序员站长
2022/11/16
1.2K0
有意思的水平横向溢出滚动
最近接到一个很有意思的需求,能否做到当内容横向溢出时,依然能够使用鼠标滚轮对内容进行滚动的方法。
Sb_Coco
2022/09/28
2.6K0
有意思的水平横向溢出滚动
绝对定位多个字居中显示的css
在工作中遇到一种情况,例如把一个div元素绝对定位到一个位置,但是该元素中的文字个数不确定,还要保证始终该文字是居中显示,则可以定义两个div,外层div绝对定位并加一个宽度,内层div居中 .box03 .percent { position: absolute; right: 31%; top: 12%; width: 100px; font-family: arial;
蓓蕾心晴
2018/04/12
1.6K0
【CSS】定位 ⑤ ( 子元素绝对定位 父元素相对定位 | 代码示例 )
此时就要求父容器必须稳定 , 如果父容器使用了 绝对布局 , 父容器就不会保留位置 ,
韩曙亮
2023/04/16
2K0
【CSS】定位 ⑤ ( 子元素绝对定位 父元素相对定位 | 代码示例 )
CSS 定位布局 - 相对、绝对、固定三种定位
文档流,是指盒子按照html标签编写的顺序依次从上到下,从左到右排列,块元素占一行,行内元素在一行之内从左到右排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置。
Devops海洋的渔夫
2019/05/31
3.6K0
一种绝对提高开发水平的方法
如果做了多年开发的你发现自己的水平一直上不去,你可能要提高自己的英文水平了,英语就是你技术的瓶颈,对有些人可能是硬伤。
张果
2018/07/31
9.2K2
一种绝对提高开发水平的方法
一种绝对提高开发水平的方法
AntConc 使用工具软件可以把一本电子档中的单词全部提取出来,并分析其出现频率
IT小马哥
2020/03/18
5310
RecyclerView滚动到指定位置
1、mLayoutManager private void moveToPosition(int position) { if (position >= 0) { mLayoutManager.scrollToPositionWithOffset(3, 0); } } 2、LinearSmoothScroller mTopSmoothScroller = new TopSmoothScroller(getActivity()); priva
用户9854323
2022/06/25
1.8K0
vue css 滚动楼层导航定位
理解滚动图 左右结构 <template> <div> <div class="floor-nav"> <ul class="nav-list"> <li
solate
2021/03/05
3.1K0
vue css 滚动楼层导航定位
点击加载更多

相似问题

屏外绝对定位分区导致水平滚动

43

CSS:绝对定位元素导致滚动

130

水平滚动一个绝对定位的元素?

16

如何避免绝对定位div引起的水平滚动

14

负位置:绝对导致iPad上的水平滚动

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档