- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正好好奇,for (let p in this)
用的函数是什么?我正在重构代码并想替换
const result: string[] = [];
for (let p in this) { result.push(p); }
调用 const result = Object.getOwnPropertyNames(this);
。但是因为我知道这个函数不返回继承的属性(就像外观一样)我需要找到一个不同的解决方案。我很确定有一个。
在我的场景中,基础模型(每个模型扩展的类)是this
。我想获取具体类型实现的所有字段(和属性 [get/set])的数组。
编辑:我刚刚添加了 an example
最佳答案
你想重新实现这个:
function inheritedEnumerableKeys(x: object): string[] {
const ret: string[] = [];
for (let k in x) ret.push(k);
return ret;
}
不使用 for...in
loop .这是可能的,但这不是单线的。属于the different ways of traversing object properties in JavaScript ,只有 for...in
为您提供继承的属性键;其他一切都只给出自己的属性。所以如果你想获得继承的属性,你需要显式地 walk the prototype chain并从每个人那里收集自己的属性(property):
function inheritedEnumerableKeys(x: object): string[] {
const proto = Object.getPrototypeOf(x);
const ownKeys = Object.keys(x);
return (proto && typeof proto === "object") ?
[...ownKeys, ...inheritedEnumerableKeys(proto)] :
ownKeys;
}
这是一个递归函数,但也可以将其写成一个循环,以便与 for...in
版本进行比较:
function inheritedEnumerableKeys(x: object): string[] {
const ret: string[] = [];
for (let v = x; v && typeof v === "object"; v = Object.getPrototypeOf(v)) {
ret.push(...Object.keys(v));
}
return ret;
}
让我们测试一下。使用您的原始 modelProperties()
定义,我们得到以下输出:
console.log(new MyModel().modelProperties);
// ["propertyA", "_propertyB", "propertyB"]
如果我将实现更改为:
get modelProperties(): string[] {
return inheritedEnumerableKeys(this);
}
我们得到相同的输出:
console.log(new MyModel().modelProperties);
// ["propertyA", "_propertyB", "propertyB"]
无论我们使用 inheritedEnumerableKeys()
的三个版本中的哪一个。
让我们针对具有显式原型(prototype)层次结构的对象测试这三个版本:
const z = { a: 1, b: 2, c: 3 };
const y = Object.assign(Object.create(z), { d: 4, e: 5, f: 6 });
const x = Object.assign(Object.create(y), { g: 7, h: 8, i: 9 });
inheritedEnumerableKeys()
的所有三个版本都产生
console.log(inheritedEnumerableKeys(x));
// ["g", "h", "i", "d", "e", "f", "a", "b", "c"]
那么,这就是您所提问题的答案。
但是在没有一些相反的强大用例的情况下,我建议直接使用 for...in
循环,它比任何一个都更简单、更惯用,而且很可能更高效其他方法。
关于typescript - Javascript : Function equivalent of `for (let p in this)` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73879069/
我需要一个正则表达式,它只会选择那些不以 .png 或 .css 等特定扩展名结尾的 URL 字符串。 我测试了以下内容: 1)这个使用负回顾: (? SetHandler "proxy:un
我似乎无法确切地掌握名称的等效性。我很确定我的结构已经下降。我的教授给出的一个例子是: Type TI=integer Type TTI=TI a=integer b=TTI f= ref
我最近为问题“A Regex that will never be matched by anything ”( my answer here ,请参阅更多信息)计时了一堆正则表达式。 然而,在我测试
Clojure 为 提供方法懒惰评估 (无限)序列中的值。有了这个,值只会在它们被实际消耗时计算。 一个重复元素的无限序列示例: (take 3 (repeat "Hello StackOverflo
如果我使用文本文件在 Solr/Lucene 中定义同义词,如下所示: foo, bar, goo abc, bar, xyz 字bar在两条线上。 这是否意味着 Solr 将所有术语都视为同义词,因
在 Xcode 中,当您设置键盘快捷键时,有一个很好的控件可以帮助您: 我觉得我可以通过扩展 NSTextField 来重现它,但我也觉得这可能是其他人以前做过的事情。我做了一些搜索,但没有找到任何结
我对汇编语言有点陌生,很难理解术语“字节等效”。 它用于以下上下文:- MOV 指令有时会引起歧义。例如,查看以下语句: MOV EBX, [MY_TABLE] ; Effective Addre
这是一个“软性问题”,因此,如果此发布地点不合适,请告诉我。 本质上,我想知道如何谈论在某种意义上“等效”而在另一些意义上“不同”的算法。 这是一个玩具示例。假设我们得到了一个长度为list的数字n的
我(在 Protege 中)定义了一个 Missing 类,它相当于 ((not (atHome value 30)) and (not (atWork value 30)))and (not (on
我正在处理一个烦人的数据库,其中一个字段包含真正应该存储在两个单独字段中的内容。因此该列存储的内容类似于“第一个字符串~@~第二个字符串”,其中“~@~”是分隔符。 (再说一次,我没有设计这个,我只是
在 Django 中,这两个是等价的吗? Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000) 和 Cars.objects.e
此代码行选择任何类名不是“id”和“quantity”的 div 内的所有子输入:: $("div.item > div:not(.id,.quantity) > :input").live("key
在 Vue 1.x 中,我使用以下指令直接选择一个节点。 然后: this.$els.visibleColumns 是否有 Vue 2.x 方法来做到这一点? 最佳答案 当然,所以它已被 ref/$
我在underscore.js源码中看到了这段代码: if ((!a && b) || (a && !b)) return false; 这是否等同于以下内容? if (a ^ b) return f
我需要一些关于批处理文件中 grep -v Wildcard 和 grep -o 的等效代码的帮助。 这是我在 shell 中的代码。 result=`mysqlshow --user=$dbUser
我试图在 SQL 中找到等同于 IN\NOT 的 ElasticSearch 查询。 我知道我们可以使用带有多个 OR 的 QueryString 查询来获得相同的答案,但最终会得到很多 OR。 谁能
On a separate post , 我在帮忙George Edwards使用 BLE API 分解一些代码. 我很确定我发布的代码(使用分解模板)与原始代码相同。但是当 George 将它发送到
是否有办法“模仿”background-size:cover; 的行为? (参见 http://www.w3schools.com/cssref/playit.asp?filename=playcss
我正在使用 Qt。我需要直接向我的打印机写入一些文本。在 Windows 上,我可以使用 winapi OpenPrinter 和 WritePrinter 执行此操作,但我需要此代码才能在 linu
我搜索过并使用过 UIDevice.currentDevice().instancesRespondToSelector(Selector("userInterfaceIdiom")) 但对我不起作用
我是一名优秀的程序员,十分优秀!