【问题标题】:Javascript Object.defineProperty set method trigger on property changeJavascript Object.defineProperty 设置方法触发属性更改
【发布时间】:2013-02-22 02:13:30
【问题描述】:

以具有 details 属性的 Person 类的以下 (coffeescript) 示例为例,该类又具有自己的属性:

class Person
  constructor: ->
    details =
      name: ''
      age: 0

    Object.defineProperty this, 'details',
      enumerable: yes
      get: => details
      set: (value) =>
        console.log 'set details:', value
        details = value

p = new Person

# does NOT trigger details set()
p.details.name = 'Simon'

# DOES trigger details set(), but takes a bit of effort...
details = p.details
details.name = 'Someone else'
p.details = details

显然,如果我只是将姓名和年龄定义为 Person 类的属性,我可以避免这个问题,但这只是一个示例。

是否有任何简单的方法可以让我的 details set() 方法在其属性更改时触发?

【问题讨论】:

    标签: javascript object coffeescript setter ecmascript-5


    【解决方案1】:

    不是真的。至少不简单。

    pp.details 是完全不同的对象。修改p.details 根本不会改变p 的任何内容。所以它不会收到消息。

    您需要做的是安装一些代码,使 details 对象在其自身属性发生变化时向其父对象发送消息。这也意味着它需要知道它的父母是什么。

    class Person
      constructor: ->
        details =
          name: ''
          age: 0
    
        Object.defineProperty this, 'details',
          enumerable: yes
          get: -> details
          set: (value) ->
            console.log 'set details:', value
            details = value
    
            # set parent object to tell when something changes
            value._parent = this
    
            # create a name setter, which tells it's parent when it changes.
            Object.defineProperty details, 'name',
              enumerable: yes
              get: -> @_name
              set: (value) ->
                @_parent.didUpdateDetails()
    
         # trigger setter to install hook
         @details = details
    
       didUpdateDetails: ->
         console.log 'Updated details!'
    
    p = new Person
    p.details.name = 'Alex'
    # logs: "Updated details!"
    

    是的,这确实有效:http://jsfiddle.net/PkyaU/1/

    但老实说,这有点疯狂。你确定这是你需要做的吗?也许你应该重新考虑你的方法。

    【讨论】:

      猜你喜欢
      • 2016-09-12
      • 2014-12-23
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多