在JavaScript中定义自定义对象和函数(第2部分)

时间:2012-08-30 14:41:20

标签: javascript ecmascript-5 jscript

根据我在此之前提出的问题,我将如何限定此字符串...

"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"

3 个答案:

答案 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);

http://jsfiddle.net/jbabey/4GVUK/

答案 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函数背后的想法是允许开发人员:

  1. 按名称定义对象/功能(E.G.“Custom”或“Custom.prototype.foo.bar”),无论该对象存在。

  2. 定义对象/功能上下文(E.G窗口)

  3. 定义对象/功能实现

  4. 定义在实现已存在时是否覆盖对象/函数。

  5. 考虑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 ......我还没有在其他浏览器中测试过!