Возможно ли применить прототип Объекта только внутри замыкания функции? - PullRequest
1 голос
/ 15 июня 2011
function test(){
    String.prototype.to_selector=function(a){return "#"+a;}
    return "asd".to_selector();
}

Я хочу, чтобы "asd".to_selector(); не работал вне функции. Как это сделать? Или это нужно?

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

Невозможно изменить прототип 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 голосов
/ 15 июня 2011
function test(){
    String.prototype.to_selector=function(a){return "#"+a;}
    var o = "asd".to_selector();
    delete String.prototype.to_selector;
    return o;
}
2 голосов
/ 15 июня 2011

Нет, это невозможно, и в вашем примере это не очень полезно, я бы сказал.Почему бы просто не использовать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...