根据我在此之前提出的问题,我将如何限定此字符串...
"MyCustomObject.prototype.foo.bar"
到此:
window['MyCustomObject']['prototype']['foo']['bar']
以对象形式? (它必须没有资格......
"window['MyCustomObject']['prototype']['foo']['bar']"
...作为一个字符串!)。
作为参考,请考虑以下内容......(代码错误......需要修复(不使用eval关键字))
var fn = "MyCustomObject.prototype.foo.bar";
var ptr = fn.split('.');
var ptrPath = 'window'
for(var index = 0; index < ptr.length; index++) {
ptrPath += '[\'' + ptr[index] + '\']';
}
ptrPath = function() {
alert("Hello");
}
应该解决这个问题;
var inst = new MyObject();
inst.foo.bar(); //alerts...."Hello"
答案 0 :(得分:0)
我修改了this question中的答案,以满足您的需求。
var getPropertyByName = function (fullString, context) {
var namespaces = fullString.split(".");
var functionName = namespaces.pop();
for (var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[functionName];
};
getPropertyByName('MyCustomObject.foo.bar', window);
答案 1 :(得分:0)
您可以尝试这种方式:
var fn = "foo.prototype.bar";
var ptr = fn.split('.');
var func = ptr.reduce(function(a, b){
return a[b] ? a[b] : a;
}, window);
的 The working demo. 强> 的
答案 2 :(得分:0)
经过多方努力,我找到了解决方案。
Object.implement函数背后的想法是允许开发人员:
按名称定义对象/功能(E.G.“Custom”或“Custom.prototype.foo.bar”),无论该对象存在。
定义对象/功能上下文(E.G窗口)
定义对象/功能实现
定义在实现已存在时是否覆盖对象/函数。
考虑Object.implement代码示例:
Object.implement = function(fn, context, implementation, override) {
var properties = fn.split('.');
var fnName = properties.pop();
for(var index = 0; index < properties.length; index++) {
if(!context[properties[index]]) {
context[properties[index]] = { };
}
context = context[properties[index]];
}
if(!context[fnName] || override) {
context[fnName] = implementation;
}
};
我现在可以使用它来安全地创建/实现对象和函数。考虑这有点像“垫片”功能,如果某个功能不存在,可以提供一个实现,但是增加的功能也可以覆盖现有的功能:
Object.implement("HashTable", window, function() { }, true);
Object.implement("HashTable.prototype.bar", window, function() { alert("Hello World") }, true);
var ht = new HashTable();
ht.bar();
它适用于FireFox ......我还没有在其他浏览器中测试过!