无法获取对象的基类型
Unable to get an object's base type
我正在尝试获取对象的基类型但失败了。 Chrome的控制台好像可以,我不行
这是控制台给我的信息:
我正在尝试以某种方式获得 Blockly.FieldDropdown
。
Chrome 控制台如何找到它,但我找不到?
对象由Google块返回:
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/blockly@3.20191014.3/blockly.min.js"></script>
我试过找到一种 returns 类型的 Blockly 方法,但我还没有见过。
这是我想出的。它通过迭代 Blockly
对象的属性并检查 属性 是否可实例化以及我们正在检查的对象是否是它的直接实例来工作。
这是一个非常专业的解决方案,适用于单个 class 及其直接属性。更通用的解决方案必须递归迭代 window
(如果不在浏览器上下文中则为 globalThis
)对象,这将非常耗费资源(可能会冻结浏览器)并且必须包含一个防止 Too much recurson
错误的机制。此外,对于更深的嵌套,由于继承可能会出现区分实例和子实例的问题。 在这件事上提供了线索。
已经概述了为什么所有这些都无法使用简单的内置解决方案来实现的原因 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/Whosebug/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/blockly@3.20191014.3/blockly.min.js"></script>
我正在尝试获取对象的基类型但失败了。 Chrome的控制台好像可以,我不行
这是控制台给我的信息:
我正在尝试以某种方式获得 Blockly.FieldDropdown
。
Chrome 控制台如何找到它,但我找不到?
对象由Google块返回:
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/blockly@3.20191014.3/blockly.min.js"></script>
我试过找到一种 returns 类型的 Blockly 方法,但我还没有见过。
这是我想出的。它通过迭代 Blockly
对象的属性并检查 属性 是否可实例化以及我们正在检查的对象是否是它的直接实例来工作。
这是一个非常专业的解决方案,适用于单个 class 及其直接属性。更通用的解决方案必须递归迭代 window
(如果不在浏览器上下文中则为 globalThis
)对象,这将非常耗费资源(可能会冻结浏览器)并且必须包含一个防止 Too much recurson
错误的机制。此外,对于更深的嵌套,由于继承可能会出现区分实例和子实例的问题。
已经概述了为什么所有这些都无法使用简单的内置解决方案来实现的原因 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/Whosebug/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/blockly@3.20191014.3/blockly.min.js"></script>