光!在JavaScript中,几乎任何值都可以成功地检索其constructor
:
console.log((33).constructor); // Number
console.log((false).constructor); // Boolean
console.log(('hello').constructor); // String
console.log(({}).constructor); // Object
console.log(([]).constructor); // Array
console.log((v => v).constructor); // Function
我也知道您可以举办一个实例没有constructor
属性的类:
let O = function(){};
O.prototype = Object.create(null);
console.log((new O()).constructor)); // undefined
我在这里感兴趣的是,当试图检索其构造函数时会导致错误。我只知道两个这样的值:
console.log((null).constructor); // TypeError!
console.log((undefined).constructor); // TypeError!
我的问题是: null
和undefined
仅有两个具有此类行为的可能值?
我的问题是:无效和未定义的仅有的两个可能具有这种行为的值?
默认情况下,是的,因为如果对象或其任何原型上不存在属性,则获得值undefined
。null
和undefined
投掷的原因是您无法尝试从中获取属性。它们是当您尝试从中获取财产时唯一以这种方式行为的事情。
但是,当您获得constructor
属性时,任何对象都可以是直接丢弃错误:
const o = {
get constructor() {
throw new Error("Don't do that!");
}
};
console.log(o.constructor);
或使用陷阱阻止它的代理:
const o = new Proxy({}, {
get(target, propName, receiver) {
if (propName === "constructor") {
throw new Error("Don't do that!");
}
return Reflect.get(target, propName, receiver);
}
});
console.log(o.constructor);