2017-01-16 6 views
0

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

Пусть у меня есть функция с именем testFunc

function testFunc(){ 
// Logic 
} 

теперь я могу инициализировать п количество экземпляров с использованием нового

var t1 = new testFunc(); 
var t2 = new testFunc(); 
. 
. 
. 
. 

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

+0

В чем причина этого? Почему вы хотите ограничить? – Joseph

+0

@JosephtheDreamer Изучение Javascript. Так что старайтесь все возможности, которые приходят на ум. Нет бизнес-причины. –

ответ

3

Несомненно, почему бы и нет?

var instances = 0; 
 
function testFunc() { 
 
    if (instances >= 2) { 
 
    throw "instance limit exceeded"; 
 
    } 
 
    instances++; 
 
} 
 

 
var t1 = new testFunc(); 
 
console.log('t1 ok'); 
 
var t2 = new testFunc(); 
 
console.log('t2 ok'); 
 
var t3 = new testFunc(); 
 
console.log('t3 ok');

+1

Вместо использования глобальной переменной может быть полезно использовать статическое свойство, прикрепленное к этой функции. –

+0

@ BorisGuéry Конечно, или вы можете использовать закрытую переменную закрытия. Принцип тот же. – melpomene

+0

Да, я просто указал на статическое «ключевое слово», поскольку это, как правило, способ справиться с этим типом сингла на большинстве языков;) –

0

Может быть не так удобно, но вы также можете использовать прокси-сервер:

function wrapped() {}; 

const testFunc = new Proxy(wrapped, { 
    maxInstances: 3, 
    instances: 0, 
    construct: function (target, argumentsList, newTarget) { 
     if (this.instances >= this.maxInstances) { 
      throw new Error('Ran out of instances...'); 
     } 
     this.instances++; 
     return new wrapped(); 
    } 
}); 

new testFunc(); 
new testFunc(); 
new testFunc(); 
new testFunc(); // throws 

прокси может быть возвращена, например, allowMaxInstances Функция, которая позволит повторно использовать этот шаблон.

Или вы можете использовать шаблон Singleton (по аналогии с ответом @melpomene):

const TestFunc = (function() { 
    const maxInstances = 3; 
    let instances; 

    function createInstance() { 
     const object = new Object('I am new...'); 
     return object; 
    } 

    return { 
     getInstance: function() { 
      if (instances < maxInstances) { 
       return createInstance(); 
      } 
      throw new Error('Run out of instances...'); 
     } 
    }; 
})(); 

TestFunc.getInstance(); 
TestFunc.getInstance(); 
TestFunc.getInstance(); 
TestFunc.getInstance(); // throws