【问题标题】:Property definition is method definition when using knockout属性定义是使用敲除时的方法定义
【发布时间】:2013-08-22 16:38:06
【问题描述】:

根据Google style guide,方法应该在构造函数的原型上定义,属性应该在构造函数中使用this关键字定义。

我的大部分前端开发都是使用 Knockout 进行的,它通过将观察属性转换为函数来处理它们。也就是说,我的所有属性现在或多或少都是方法。这是对性能的重大影响吗?是否有任何使用 JavaScript getters and setters 的 Knockout 解决方法?

【问题讨论】:

    标签: javascript knockout.js v8 google-style-guide


    【解决方案1】:

    首先,是的,有一个使用 getter 和 setter 的淘汰赛插件,但它只适用于较新的浏览器。您牺牲了对 IE8The plugin can be found here.

    你的主要观点:理解风格指南的意图很重要。因为方法通常可重用,所以将它们放在原型上可以节省重复的代码和内存分配。这就是为什么建议将它们放在原型上的原因。但是,淘汰的可观察对象不可重复使用。它们的行为类似于属性:它们存储特定于实例的信息。这种差异很重要。它们可能函数,但它们被视为属性

    Google 风格指南根本没有解决这种情况。将它们放在实例上不会影响性能,因为您将它与无法工作的场景进行比较。将 observable 放在原型上会破坏模型。做唯一有效的事情不会影响性能。

    最后一点,getter 和 setter 插件不会使函数消失,它只是将它们隐藏在 getter 和 setter 后面。性能不会提高,因为仍然需要做同样的工作。

    【讨论】:

    • 我不知道淘汰赛,但究竟是什么让函数实例依赖?如果数据存储在对象上,则无需为每个对象单独创建函数。
    • 函数必须围绕实例数据关闭,并且它们必须拦截读取和写入以便通知订阅者更改。这些函数有一个他们必须发布到的订阅者列表,该列表依赖于实例(您无权访问它),并通知诸如计算之类的读者正在读取一个可观察对象,以便他们知道建立订阅。 .
    • 实际上这只是淘汰赛的特质,并不是真正的限制。绝对没有理由不能使用这样的东西:jsfiddle.net/Y6Dds(是的,有些人可能会认为字符串很尴尬,但 Ember 可以很好地解决这个问题)
    • @Esailija 我不知道你为什么提出字符串,但你发布的代码会导致原型上的任何对象在它们之间共享数据。当然,您不希望每个视图模型都与所有其他相同类型的视图模型共享其firstName
    • .firstName() 是方法,类似__firstName$(或您喜欢的任何修改)是存储在实例上的实际数据,可通过this 基于字符串"firstName" 访问。仅使用 this 和局部变量的函数可以共享,而闭包则不能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2012-07-20
    • 2014-10-01
    • 2013-04-01
    相关资源
    最近更新 更多