簡體   English   中英

Javascript Object.defineProperty set 方法在屬性更改時觸發

[英]Javascript Object.defineProperty set method trigger on property change

下面是一個帶有 details 屬性的 Person 類(咖啡腳本)示例,該類又具有自己的屬性:

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

顯然,如果我只是將 name 和 age 定義為 Person 類的屬性,我可以避免這個問題,但這只是一個例子。

有沒有什么簡單的方法可以讓我的 details set() 方法在其屬性更改時觸發?

並不真地。 至少不是簡單的。

p是與p.details完全不同的對象。 修改p.details根本不會改變關於p任何內容。 所以它不會收到消息。

您需要做的是安裝一些代碼,當它自己的屬性更改時,使詳細信息對象向其父對象發送消息。 這也意味着它需要知道它的父級是什么。

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/

但老實說,這有點瘋狂。 你確定這是你需要做的嗎? 也許你應該重新考慮你的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM