我有這個對象,第三方跟蹤工具類似於谷歌分析。我想用我自己的「緩存」功能擴展它,以便保存之前跟蹤調用的數據,以便我可以根據需要在下一個跟蹤調用中引用相關內容。JavaScript引用動態父對象
這是我迄今爲止,它的工作原理:
// Current 3rd party tool, can't really mess with this.
// It is loaded from an external script
window.someTool={/* stuff */};
// my code
someTool._cache=someTool._cache||{};
someTool._cache._get=function(variabl) {
var length,index,variabl=(variabl||'').split('.'),
cache=someTool&&someTool._cache&&someTool._cache._dataLayer||{};
for (index=0,length=var.length;index<length;index++){
cache=cache[variabl[index]];
if (!cache) break;
}
return cache;
};
所以後來我/請執行下列操作
// data layer output on initial page that gets wiped later
var dataLayer = {
'page' : {
'name' : 'foo',
'lang' : 'en'
},
'events' : {
'pageView' : true,
'search' : true
}
}
// I grab the initial data layer and save it here
someTool._cache._dataLayer = dataLayer;
然後,這可以讓我做的東西一樣
someTool._cache._get('page'); // returns {'page':{'name':'foo','lang':'en'}
someTool._cache._get('page')['name']; // returns 'foo'
someTool._cache._get('page.lang'); // returns 'en'
So th對我來說很有用,但這裏提出了一個問題/目標:我想改善我的_get
功能。也就是說,我不喜歡我必須硬編碼someTool
,或甚至_cache
,如果我可以以某種方式擺動它,_dataLayer
。
在理想情況下,我想的someTool._cache._dataLayer
傳遞,這樣,如果someTool
,_cache
,或_dataLayer
要改變的命名空間,我沒有更新_get
參照/暴露於_get
(例如parent
類型參考)。 但我不知道該怎麼做。
這是我到目前爲止有:
(function(tool, cache, dataLayer) {
var tool = tool || {},
cache = cache || '_cache',
dataLayer = dataLayer || '_dataLayer';
dataLayer = tool[cache][dataLayer] || {};
tool[cache]._get = function(property) {
var length, index, property = (property || '').split('.');
for (index = 0, length = property.length; index < length; index++) {
dataLayer = dataLayer[property[index]];
if (!dataLayer) break;
}
return dataLayer;
};
})(someTool, '_cache', '_dataLayer');
這似乎是工作的第一一次我稱呼它,例如
someTool._cache._get('page')['name'];
//返回「富」
但在那之後,我得到一個錯誤:
TypeError: someTool._cache._get(...) is undefined
我覺得它是與dataLayer
失去其參考什麼的,我不知道(雖然我不確定它是如何第一次工作的..)。我所做的甚至是可能的,如果是的話,我會在哪裏出錯?或者是我最初能做的最好的事情?
一個友好的建議。您應該使用更多描述性變量名稱和更清晰的格式,尤其是當您要求其他人閱讀您的代碼時 – nem035
@ nem035好的,我確定使用擴展變量名更新了我的代碼,謝謝 – slinkhi
實際上,空格和格式化將幫助更多擁擠的名字:)。只需使用'tidy'選項作爲代碼片段,這就是我對我的編輯所做的事情,它爲您做了格式化。 – nem035