我正在尝试获取对象的基本类型,但是失败了。 Chrome的控制台似乎可以做到,但我做不到。这是控制台给我的:我试图以某种方式获取Blockly.FieldDropdown。Chrome控制台如何找到它,但是我找不到?该对象由Google Blockly返回:var block = Blockly.mainWorkspace.getBlockById(e.blockId);var field = block.getField(inputId); //field is the object shown in console above...或作为一个独立的工作示例:var field = new Blockly.FieldDropdown([['left', 'LEFT'], ['right', 'RIGHT']]);// these return an empty string, but I'd like to get back "Blockly.FieldDropdown"console.log(Object.getPrototypeOf(field).constructor.name);console.log(field.__proto__.constructor.name);// the following shows "Blockly.FieldDropdown" in front of the properties// in Chrome's dev console (but not in Firefox for example,// and the name is not accessible):// console.log(field);<script src="https://cdn.jsdelivr.net/npm/[email protected]/blockly.min.js"></script>我试图找到一种返回该类型的Blockly方法,但是我还没有看到。 最佳答案 这是我想出的。它通过遍历Blockly对象的属性并检查该属性是否可实例化以及我们正在检查的对象是其直接实例来工作的。这是一个非常专业的解决方案,适用于单个类及其直接属性。一个更通用的解决方案将必须递归地遍历window(如果不在浏览器上下文中,则globalThis)对象,这将非常耗费资源(可能冻结浏览器),并且必须包含一种防止错误。同样,随着嵌套的深入,由于继承,可能会出现区分实例和子实例的问题。 This answer在此问题上发挥了主导作用。in this related answer概述了使用普通的内置解决方案无法完成所有这些操作的原因。var field = new Blockly.Field();var fieldD = new Blockly.FieldDropdown([['left', 'LEFT'], ['right', 'RIGHT']]);var fieldI = new Blockly.FieldImage('https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png', 1200, 286);function getBaseType(o) { let baseType = null; Object.entries(Blockly).find(([name, t]) => { let isInstanceOf = t && t.prototype && Object.getPrototypeOf(o) === t.prototype; if (isInstanceOf) { baseType = `Blockly.${name}`; } return isInstanceOf; }); return baseType;}console.log(getBaseType(field));console.log(getBaseType(fieldD));console.log(getBaseType(fieldI));<script src="https://cdn.jsdelivr.net/npm/[email protected]/blockly.min.js"></script>
09-13 08:52