【问题标题】:can you add properties on to functions in Dart?你可以在 Dart 中的函数上添加属性吗?
【发布时间】:2013-05-03 05:38:25
【问题描述】:

你可以为 dart 中的函数添加属性吗?我试过这个:

void main(){

    fn(){
        //DoSomething
    };

    fn.id = 1; //Exception NoSuchMethod

}

只得到一个 NoSuchMethod 异常抛出。有没有办法在运行时向函数或任何类型的对象添加属性,比如在 javascript 中?

(还有为什么当我分配给一个属性时它说没有这样的方法异常?)

【问题讨论】:

    标签: javascript dynamic methods properties dart


    【解决方案1】:

    您不能在Function 上添加属性。但是,您可以定义一个可以像函数一样调用的Object(参见Emulating Functions in Dart)。这是一个例子:

    class WannabeFunction {
      var id;
      call(int a, int b) => a + b;
    }
    
    main() {
      var wf = new WannabeFunction();
      wf.id = 1;
      wf(3, 4); // 7
    }
    

    对于NoSuchMethodError:当您使用fn.id = 1 时,您实际上在fn 上调用了一个隐式设置器id=。这就是您收到此错误的原因。

    【讨论】:

      【解决方案2】:

      您不能添加或删除对象的成员。从概念上讲,对象是一个小结构,带有指向其类描述的指针和一些用于存储其状态的内存。类描述定义了结构在分配点的布局。如果类描述不包含字段id(如您的示例中),则根本无法添加它。您既不能更改类描述也不能更改实际实例(因此它有更多的内存用于额外的字段)。这可能很烦人(尤其是对于用于动态修改其对象的 JavaScripters),但它为程序员提供了一定的保证并使其更容易优化。对象使用更少的内存,优化编译器可以做出原本不成立的假设。

      不过,有一种方法可以通过 expandos 从侧面添加属性

      【讨论】:

        【解决方案3】:

        简单地说没有。
        不过,Expando 可以模仿。

        var e = new Expando();
        e[f] = 'hi';
        print(e[f]);//prints hi
        

        宣传我的包裹可能不合适,但因为它是相关的:

        import 'package:mistletoe/mistletoe.dart';
        Dynamism d = new Dynamism(expert:true);
        void main(){
            var o = new Object();
            d.on(o).greetings = ()=>print('hello world');
            d.on(o).greetings();//prints hello world
            o = null;
            //With o garbage collected, d is empty now. 
        }
        

        git:https://github.com/TastyCatFood/mistletoe

        还有像这样的包:https://pub.dartlang.org/packages/dynamic_object,它似乎覆盖了 noSuchMethod 来创建一个允许伪动态添加属性的自定义类。如果您扩展类 Function 并覆盖 noSuchMethod,我相信您可以创建一个允许您添加属性的函数对象。

        一般来说,您应该避免让您的代码过于动态化。 Dart 分析器和你的 IDE 不支持这些 hacky 的东西。虽然,有时你需要它。

        【讨论】:

          猜你喜欢
          • 2011-10-03
          • 2022-08-15
          • 2017-09-17
          • 1970-01-01
          • 2018-10-02
          • 2018-07-06
          • 1970-01-01
          • 2010-09-12
          • 1970-01-01
          相关资源
          最近更新 更多