Ответ IAbstractDownvoteFactory - солидный ответ, и он определенно заслуживает одобрения, но я просто хочу представить один уровень абстракции помимо его / ее ответа:
Рассмотрим следующий помощник:
function createBoundMethodsFor(obj) {
var proto = obj.constructor.prototype
for(var method in proto)
if(typeof(proto[method]) === 'function')
obj[method] = function() { return proto[method].apply(obj, arguments); }
}
Тогда давайте снова посмотрим на конструктор для человека:
function Person(firstName, lastName) {
this.FirstName = firstName;
this.LastName = lastName;
createBoundMethodsFor(this)
}
Person.prototype.FullName = function() {
return this.FirstName + ' ' + this.LastName;
}
Этот помощник перебирает все functions
в prototype
объекта и создает связанные замыкания для каждого и переопределяет их как методы экземпляра, но они просто передают метод прототипа. Использование такого помощника может значительно упростить вашу жизнь, поскольку число методов объекта становится нетривиальным.
Но учтите, что связанные методы, подобные этому, приводят к интересным результатам, которых вы, возможно, не ожидаете, например:
var john = new Person("John", "Doe")
var jane = new Person("Jane", "Doe")
var bound = john.FullName
bound() // John Doe
bound.call(jane) // John Doe (Not Jane like you might expect)
var unbound = john.constructor.prototype.FullName;
unbound() // null
unbound.call(john) // John Doe
unbound.call(jane) // Jane Doe
Скрипка здесь