2014-01-26 2 views
1

Я только начал использовать шаблон модуля в JavaScript для объявления функциональных объектов, но обнаружил, что это раздражает повторение ключевого слова Foo.prototype при объявлении всех этих публичных функций, которые могут вам понадобиться.Использование переменной как сокращение для Foo.prototype

Таким образом, я придумал с помощью некоторой сокращенной переменной для удобства следующим образом.

(function(){  
    var Foo = function(){ 
     alert('created Foo'); 
    } 

    // shorthand for further creation of public functions 
    var pro = Foo.prototype; 

    //public function with shorthand 
    pro.bar = function(){ 
     //some cool stuff here 
    } 
    return window.Foo = Foo; 
}()); 

Вопрос: есть ли какая-то причина, чтобы помешать мне экономить эти несколько символов относительно функциональности или какой-либо непредвиденной ошибки или это безопасно? Кажется, это работает отлично для случаев, в которых я использовал его?

+1

Это хорошо, но не забудьте 'var' вашу переменную' Foo' – Xotic750

+0

Спасибо! обновлено, что –

+1

@ Xotic750: Тогда не было бы причин запускать этот код вообще, потому что 'Foo' не будет доступен снаружи. Я считаю, что «Foo» предназначен для глобальных, но лучший способ сделать это - «var Foo = ...; window.Foo = Foo; '. * edit: * Или, может быть, нет, кто знает: D –

ответ

3

Насколько я знаю, прототипы - это объект, как любой другой, когда нужно его модифицировать. Сохранение ссылки на него абсолютно нормально

0

Edit:

Это нормально, чтобы сделать это, но иногда сбивает с толку, что если у вас есть такой код:

var pro='123'; 

(function() { 
    var Foo=function() { 
     alert('created Foo'); 
    }; 

    // shorthand for further creation of public functions 
    var pro=Foo.prototype; 

    var x=new Foo(); 
    alert(pro); 
})(); 

alert(pro); 

или случайно написать это :

var pro='123'; 

(function() { 
    var Foo=function() { 
     alert('created Foo'); 
    }; 

    // use pro without var 
    pro=Foo.prototype; 

    var x=new Foo(); 
    alert(pro); 
})(); 

alert(pro); 

первый из них будет работать правильно, только это заблуждение при чтении кода, читатель должен знать о том, что var pro в IIFE не тот же pro в глобальном масштабе.

Последнее может быть ужасной ошибкой, что pro переназначен и утратил свое первоначальное значение.

Так что я предложил код, как он есть в моем первоначальном ответе, потому что вы не можете изменить this внутри функции.


Я думаю, что вы можете сделать это таким образом ..

var Foo=(function() { 
    function Foo() { 
     alert('created Foo'); 
    } 

    // inside the anonymous function `this` is `Foo.prototype` 
    (function() { 
     this.bar=function() { 
      //some cool stuff here 
     }; 
    }).call(Foo.prototype); 

    return Foo; 
})(); 

var x=new Foo(); 
x.bar(); 
+1

Да, но это не отвечает на вопрос OP;) –

+1

Спасибо! Тем не менее это еще одна часть, которая помогает мне понять все это! –

+1

@FelixKling: Хм .. это лучше сейчас ..? –

Смежные вопросы