Вы пытаетесь унаследовать от Function
.Это правильная боль, чтобы сделать.Вместо этого я предлагаю вам сделать следующее:
Live Example
var Proto = Object.create(Function.prototype);
Object.extend(Proto, {
constructor: function (d) {
console.log("construct, argument : ", d);
this.d = d;
// this is your constructor logic
},
call: function () {
console.log("call", this.d);
// this get's called when you invoke the "function" that is the instance
return "from call";
},
method: function () {
console.log("method");
// some method
return "return from method";
},
// some attr
attr: 42
});
Вы хотите создать объект-прототип, который станет основой вашего "класса".Он имеет ваши общие методы / атрибуты.Он также имеет конструктор, который вызывается при построении объекта, и метод вызова, который вызывается при вызове функции
var functionFactory = function (proto) {
return function () {
var f = function () {
return f.call.apply(f, arguments);
};
Object.keys(proto).forEach(function (key) {
f[key] = proto[key];
});
f.constructor.apply(f, arguments);
return f;
}
}
Фабрика функций берет объект-прототип и возвращает фабрику для него.Возвращаемая функция при вызове даст вам новый объект функции, который «наследует» от вашего объекта-прототипа.
var protoFactory = functionFactory(proto);
var instance = protoFactory();
Здесь вы создаете свою фабрику, а затем создаете свой экземпляр.
Однако это не так.Правильный прототип ОО.мы просто копируем свойства прототипа в новый объект.Таким образом, изменения в прототипе не будут отражаться обратно на исходный объект.
Если вам нужен настоящий прототип OO, вам нужно использовать хак.
var f = function () {
// your logic here
};
f.__proto__ = Proto;
Обратите внимание, как мы используем неСтандарт устарел .__proto__
и Мы изменяем значение [[Prototype]]
во время выполнения, которое считается злым.