【问题标题】:How to get reference to "instance methods" in ECMA6 [duplicate]如何在 ECMA6 中获取对“实例方法”的引用 [重复]
【发布时间】:2016-10-06 14:08:34
【问题描述】:

我需要能够序列化使用 ECMA6 中的类声明的对象。在使用标准 JavaScript 获取和序列化存储在原型中的“方法”时,我可以轻松使用 toJSON

var Foo = function(name) {
    this.name = name;
}
Foo.prototype = { 
    doSomething: function() {
        return 1;
    },
    toJSON: function() {
        // construct a string accessing Foo.prototype
        // in order to get at functions etc. stored in prototype...
    }  
};

但是如何使用 ECMA6 中的类声明来做到这一点?示例:

class Foo {
    constructor(name) {
        this.name = name;
    }   
    doSomething() {
        return 1;
    }   
    toJSON() {
        // Foo.prototype is empty. Because it hasn't been created yet?
    }
}

即使在使用new 运算符实例化之后,使用class 创建的对象似乎也有一个空原型。我错过了什么?

【问题讨论】:

  • 请修正您的代码格式。这不像您是新用户。
  • 作为批量序列化对象的替代方法,您可以序列化它们需要的所有数据,然后使用存储的数据重新创建它们。
  • 如果您需要对方法进行字符串化,然后再将它们解析回来,您可能正在做一些您不应该做的事情。
  • @vlaz,这可能行得通。显然,缺点是我必须显式访问函数名称。

标签: javascript ecmascript-6


【解决方案1】:

你在做什么听起来是个坏主意;但无论如何,类方法在原型中的;它们只是不可枚举,以避免它们出现在for .. in 迭代中(也可能是为了防止像您尝试做的事情那样容易做)。您必须使用Object.getOwnPropertyNamesObject.getOwnPropertySymbols

【讨论】:

  • 这可能是个坏主意。我这样做是因为 PhantomJS 只允许将 JSON 可序列化的东西传递给page.evaluate。我有一个测试对象模块,它在 PhantomJS 打开的页面上运行,需要传入 evaluate 并在 PhantomJS 的 page.evaluates 范围内反序列化一次。沙盒 page.evaluate 背后的想法是保持页面范围和 phantomjs 脚本分开,但 page.evaluate 确实允许传入简单数据,因此他们显然发现有有效的用例。
  • 我仍然无法让它工作。它返回一个属性名称数组,但似乎跳过了以函数为值的属性。
猜你喜欢
  • 2014-09-04
  • 2012-08-18
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2013-01-13
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多