簡體   English   中英

如何攔截使用文字符號創建的unknwon對象的已知屬性值分配

[英]How to intercept a known property value assignment of an unknwon object created using literal notation

這個問題是我在這里問的另一個問題的延續: 如何攔截和修改任何對象的特定屬性

這是一種用於攔截某個名稱的任何對象的屬性的方法,目的是在分配或讀取值時更改值或執行某些操作:

 Object.defineProperty(Object.prototype, "my_property", { set: function (value) { this._value = value; }, get: function () { return "changed"; } }); var some_object = {}; some_object.my_property = "unchanged"; document.body.innerHTML += some_object.my_property; 
 My property value is: 

盡管該方法對於創建對象后分配給屬性或從屬性讀取的值都可以正常工作,例如:

var some_object = {}; // or new Object()
some_object.some_property = "some_value"; // triggers setter
console.log(some_object.some_property);   // triggers getter

如果已使用文字符號將屬性與對象一起初始化,則不會觸發getter和setter,如下所示:

var some_object = {some_property: "some_value"}; // does not trigger setter
console.log(some_object.some_property);          // does not trigger getter

我如何才能適應以前的策略,使其也可以使用文字表示法,或者有完全不同的方法來實現這一目標? 也許通過文字表示法攔截任何對象的創建,類似於猴子修補Object.create()函數?

請記住,這只是針對任何未知對象的已知名稱的屬性。

我無法知道要達到您想要的效果。 帶有=的賦值將使您的對象通過Prototype鏈,並在Object原型上使用get方法。 但是,文字分配會將其直接放置在新對象上。 這是Javascript的規則。 有關更多信息,建議您閱讀《您不知道JS,本和對象原型》第5章,特別是“ 設置和陰影屬性”部分。

相關部分:

現在,當foo尚未直接位於myObject上但位於myObject的[[Prototype]]鏈的更高級別時,我們將研究三種方案的myObject.foo =“ bar”分配:

  1. 如果在[[Prototype]]鏈上更高的位置發現了一個名為foo的常規數據訪問器(請參見第3章)屬性,並且未將其標記為只讀(可寫:false),則將一個名為foo的新屬性直接添加到myObject中。 ,導致陰影屬性。
  2. 如果在[[Prototype]]鏈上找到foo,但是將其標記為只讀(可寫:false),則既不允許設置該現有屬性,也不允許在myObject上創建陰影屬性。 如果代碼在嚴格模式下運行,將引發錯誤。 否則,將默默忽略屬性值的設置。 無論哪種方式,都不會發生陰影。
  3. 如果在[[Prototype]]鏈上找到一個foo,並且它是一個setter(請參見第3章),則將始終調用該setter。 不會將foo添加到myObject(也稱為陰影)中,也不會重新定義foo setter。 大多數開發人員都認為,如果屬性[[Put]]的賦值在[[Prototype]]鏈上的較高位置已經存在,則總是會產生陰影,但是如您所見,這僅是其中之一(#1)剛剛描述的三種情況。

如果要在情況2和情況3下遮蓋foo,則不能使用=賦值,而必須使用Object.defineProperty(..)(請參閱第3章)將foo添加到myObject中。

暫無
暫無

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

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