2013-03-28 5 views
1

Я пытаюсь создать «конструктор» сортов, используя этот шаблон:Javascript поддельной InstanceOf

function mything() { 
    var a, b, c; 
    ... 
    return { 
     publicFunc: function() { 
      //access private vars here 
     } 
    }; 
} 

//usage 

mything1 = mything(); 
mything2 = mything(); 

Дело в том, я также хочу, чтобы он пройти тест instanceof:

assert(mything1 instanceof mything === true); 

Есть ли способ сделать это? Использование обычных конструкторов не будет работать, потому что функции прототипа не могут получить доступ к приватным vars.

+2

Для того чтобы 'instanceof' возвращал true, конструктор' prototype' должен находиться в цепочке прототипов экземпляра. –

ответ

4

Вы должны использовать несколько иной шаблон дизайна, чтобы иметь частные переменные и иметь его быть InstanceOf mything:

function mything() { 
    var a, b, c; 
    ... 
    this.publicFunc = function() { 
      //access private vars here 
     } 
    }; 
} 

//usage 

var mything1 = new mything(); 
mything1.publicFunc(); 
var mything2 = new mything(); 
0

Это технически возможно, но вы можете решить вашу проблему более элегантно (объяснение следует ниже):

function mything() { 
    var a, b, c; 

    function PrivateConstructor() { 
    this.publicFunc = function() {} 
    } 

    // this is the magic that makes it happen: 
    PrivateConstructor.prototype = mything.prototype; 

    return new PrivateConstructor(); 

} 

mything1 = mything(); 
assert(mything1 instanceof mything); // passes 

Или, с ECMAScript 5 особенности:

function mything() { 
    var a, b, c; 

    var object = Object.create(mything.prototype); 
    object.publicFunc = function() {} 

    return object; 
} 

mything1 = mything(); 
assert(mything1 instanceof mything); // passes 

Объяснение

Оператор instanceof даст истину, если правый операнд является функцией, а объект сохраняется в свойстве prototype этой функции содержится в цепи прототипов с левой стороны операнда.

Первый пример повторяет mything.prototype как свойство «prototype» для другой временной функции, которая используется только для создания одного объекта (с mything.prototype в цепочке прототипов). Второй пример создает такой объект, наследуя от mything.prototype непосредственно с Object.create().

Оба объекта наследуются от mything.prototype и поэтому проходят тест object instanceof mything.

Это, как говорится, шаблон, предложенный jfriend00, имеет меньше накладных расходов и его легче читать, предоставляя функциональность, которую вы хотели иметь.

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