【问题标题】:Unable to get an object's base type无法获取对象的基本类型
【发布时间】:2020-02-24 00:11:15
【问题描述】:

我正在尝试获取对象的基本类型但失败了。 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/blockly@3.20191014.3/blockly.min.js"></script>

我已经尝试找到一个返回类型的 Blockly 方法,但我还没有看到。

【问题讨论】:

  • 请提供更多您的代码。看起来像是代码错误。
  • @Victor 这实际上只是控制台的屏幕截图,没有太多“错误”的空间。

标签: javascript google-blockly


【解决方案1】:

这就是我想出的。它通过迭代 Blockly 对象的属性并检查该属性是否可实例化以及我们正在检查的对象是它的直接实例来工作。

这是一个非常专业的解决方案,适用于单个类及其直接属性。一个更通用的解决方案将不得不递归迭代 window(或 globalThis,如果不在浏览器上下文中)对象,这将非常消耗资源(可能会冻结浏览器)并且必须合并一种机制来防止 @ 987654326@ 错误。此外,随着嵌套更深,由于继承可能会出现区分实例和子实例的问题。 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/blockly@3.20191014.3/blockly.min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2022-01-27
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2019-07-31
    • 2013-02-28
    相关资源
    最近更新 更多