![](/img/trans.png)
[英]JavaScript: How to add a not enumerable method (not a property) in Object.defineProperty
[英]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.