是否可以仅在函数闭包内应用Object的原型?

时间:2011-06-15 06:40:38

标签: javascript closures

function test(){
    String.prototype.to_selector=function(a){return "#"+a;}
    return "asd".to_selector();
}

我希望"asd".to_selector();不在函数之外工作。怎么做?还是有必要的?

3 个答案:

答案 0 :(得分:2)

不,这是不可能的,在你的例子中,我说的并不是真的有用。为什么不直接使用:

function test(){
    var to_selector = function(a){return "#"+a;};
    return to_selector("asd");
}

如果为本机对象(此处为String)分配原型方法,则会为该对象的所有后续调用分配该方法。

可以直接将方法分配给真正的String对象,但我再也没有看到任何用例:

var test = function(a){
    var str = new String(a);
    str.to_selector = function(){return "#"+this;}
    return str.to_selector();
}
alert(test('asd')); //=> '#asd'
alert('bla'.to_selector()); //=> error

答案 1 :(得分:2)

通过修改String原型是不可能的,因为这会修改在执行此函数后创建的所有String实例。

我认为不需要为只在特定函数范围内工作的本机对象提供方法。用例是什么?您始终可以向String对象添加静态方法,或者向String原型添加实例方法(请注意,这不是一种好的做法),只能在test内使用它。

你也可以创建一个可以用于此目的的新对象,尽管你失去了直接从字符串声明中调用to_selector的优雅:

var string2 = function(str) {
    this.str = str;
};

string2.prototype = {
    to_selector: function() {
        return '#' + this.str;
    },
    toString: function() {
        return this.str;
    }
};

function test(){
    asd = new string2("asd");
    return asd.to_selector();
}

但是,再一次,我看不出这是多么方便。

答案 2 :(得分:2)

function test(){
    String.prototype.to_selector=function(a){return "#"+a;}
    var o = "asd".to_selector();
    delete String.prototype.to_selector;
    return o;
}