2015-05-28 2 views
1

Давайте представим, что у нас есть класс JavaScript:Получить общедоступные свойства класса без создания его экземпляра?

var Person = (function() { 
    function Person(name, surname) { 
     this.name = name; 
     this.surname = surname; 
    } 
    Person.prototype.saySomething = function (something) { 
     return this.name + " " + this.surname + " says: " + something; 
    }; 
    return Person; 
})(); 

Я хочу перебирать свои свойства и методы. У меня нет проблем с этими методами.

var proto = Person.prototype, 
     methods = Object.keys(proto); 

    // iterate class methods ["saySomething"] 
    for (var i = 0; i < methods.length; i++) { 
    // do something... 
    } 

Моя проблема возникает, когда я хочу, чтобы перебирать свои свойства:

var proto = Person.prototype, 
     targetInstance = new Person(), // this is my problem! 
     properties = Object.getOwnPropertyNames(targetInstance), 

    // iterate class properties ["name", "surname"] 
    for (var i = 0; i < properties.length; i++) { 
    // do something... 
    } 

Единственный способ, который я нашел, чтобы создать экземпляр и использовать Object.getOwnPropertyNames. Я хочу использовать этот код как часть структуры, поэтому я не буду контролировать классы, определенные другими разработчиками. Я хочу, чтобы избежать необходимости создания экземпляра, потому что если конструктор имел какой-то проверки, как:

function Person(name, surname) { 

    if(typeof name === "undefined" || typeof surname === "undefined"){ 
    throw new Error() 
    } 

    this.name = name; 
    this.surname = surname; 
} 

я не смог бы использовать код, указанный выше. Знаете ли вы, можно ли получить общедоступные свойства класса без создания его экземпляра?

+1

«Насколько я знаю,« нет ».« Вы должны иметь возможность допросить «Прототип», и я не знаю, как вы это сделаете. , , –

ответ

1

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

Если вы говорите о выполнения их нет, не без уродливых хаков как toString (который дает вам string представление функции тела).

Однако вы можете получить их во время компиляции, используя службу языка TypeScript, а затем создать код для поддержки времени выполнения (https://github.com/Microsoft/TypeScript/wiki/Using-the-Language-Service-API).

Ни один из них не является тривиальным.

+0

Я думал о 'toString()', но я не знал об API-интерфейсе языка для ответа –

1

Свойства не существуют, пока объект не построит их. Если ваш класс выглядел так:

var Person = (function() { 
    Person.prototype.name = null;  
    Person.prototype.surname = null; 
    function Person(name, surname) { 
     this.name = name; 
     this.surname = surname; 
    } 
    Person.prototype.saySomething = function (something) { 
     return this.name + " " + this.surname + " says: " + something; 
    }; 
    return Person; 
})(); 

вы видите имя и фамилию тоже, но, конечно, вы не можете рассчитывать на объекты, которые ищут подобное.

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