0

I'm defining a class in javascript as

    Class = (function() {
    var privateFunction = function() { return "private"; }
    return { publicFunction: function() { return privateFunction("public"); } };
    )();

Here user can access Class.publicFunction, but not Class.privateFunction.

Now I want to provide the user an interface to extend this Class. So I added a public function extend.

    Class = (function() {
            var privateFunction = function() { return "private"; }
            return { 
                    publicFunction: function() { return privateFunction("public"); } 
                    extend: function(source) { 
                            dest=this;
                            for(var prop in source)dest[prop] = source[prop]
                    }
            };
    )();

My aim was to use the extend attribute as follows

    Class.extend({
            someFunc: function() { return privateFunction("hooray"); }
    });

and access it as

    Class.someFunc()

The problem I face is the call to the privateFunction() in the extended function someFunc is not available for it. I can understand that it is the problem of the scope, but, is there anyway to solve my need.

4

2 回答 2

0
this.before = function(){return "public"};
this.publicFucntion = function(){privateFunction(this.before());}

然后只需覆盖 this.before。

于 2011-06-08T15:42:48.237 回答
0

虽然这是对封装的严重违反,但您可以通过将要添加的函数作为字符串传递并将eval其 in来执行您所描述的操作extend

Class.extend({
        someFunc: 'function() { return privateFunction("hooray"); }'
});

extend函数中,改变

                        for(var prop in source)dest[prop] = source[prop]

                        for(var prop in source)dest[prop] = eval(source[prop])
于 2011-06-08T15:36:47.993 回答