繁体   English   中英

Error 对象似乎如何在 Javascript 上自行创建属性?

[英]How does the Error object seems to create properties on itself by his own on Javascript?

好的,我首先想说我知道对此可能有一个非常基本的解释,所以如果这是一个过于新手的问题,请原谅我。

问题是:为什么在我创建新原型之前 Error.message 属性不存在?

例子:

let a = new Error('testing')
console.log( a.message ) // 'testing'

但在之前,如果我尝试访问 Error 属性和方法(例如: Object.getOwnPropertyNames(Error) ),则消息属性甚至都不存在,甚至不存在空字符串,它只是不存在。

之前不应该是空字符串吗? 创建新原型时,Error 对象如何自行创建新属性?

getOwnPropertyNames只返回对象设置的属性,而不是继承的(原型)属性。 线索就在名称中:“自己的”-properties。

举例:

const a_simple_object_with_no_prototype = {
    b: "b",
    c: "c"
};

console.log( Object.getOwnPropertyNames( a_simple_object_with_no_prototype ) )
// [ "b", "c" ]

对于具有从原型继承的属性的对象,我们会得到不同的结果:

const an_object_used_as_a_prototype = {
    a: 789
};

function ConstructorFunction() {
    this.b = "b";
}
ConstructorFunction.prototype = an_object_used_as_a_prototype;

const an_object_with_a_prototype = new ConstructorFunction();
an_object_with_a_prototype.c = "c";


console.log( Object.getOwnPropertyNames( an_object_with_a_prototype ) )
// [ "b", "c" ] // does not include "a" which is inherited from the prototype

但在之前,如果我尝试访问 Error 属性和方法(例如: Object.getOwnPropertyNames(Error) ),则消息属性甚至都不存在,甚至不存在空字符串,它只是不存在。

那是因为Object.getOwnPropertyNames(Error)只会列出Error构造函数的“静态” 1成员。 如果你执行Object.getOwnPropertyNames( Error.prototype )那么你会看到它们:

const protoProps = Object.getOwnPropertyNames( Error.prototype );
console.log( protoProps ); // ["constructor", "name", "message", "toString"]

我确实注意到,JavScript 中的Error对象充满了一些您无法在 JavaScript 本身中复制的特殊行为,例如其stack属性的工作方式,但这超出了您的问题范围。

1 :我在 C++/Java/C# 意义上使用术语“静态”,因为它是与类型而非实例相关联的字段/成员。 这并不意味着属性/字段/成员是不变的、只读的或不可变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM