Показать сообщение отдельно
  #3 (permalink)  
Старый 17.06.2015, 16:32
Новичок на форуме
Отправить личное сообщение для Splik Посмотреть профиль Найти все сообщения от Splik
 
Регистрация: 26.02.2014
Сообщений: 7

В javascript функции являются полноценными объектами встроенного класса Function. Именно поэтому их можно присваивать переменным, передавать и, конечно, у них есть свойства:
function f() {
    ...
}
f.test = 6
...
alert(f.test) // 6

Взял из:
http://javascript.ru/basic/functions#funkcii---obekty

А что сделать?
Я хочу присвоить функции(которую вернёт фабрика, т.е. объекту) прототип, однако сделать это именно кроссбраузерно можно лишь так:
Наследование происходит через скрытое свойство прототип [[prototype]], однако единственный кроссбраузерный способ указать прототип - это использовать свойство prototype функции-конструктора.
Взял из:
http://javascript.ru/tutorial/object...ype-i-prototip

Ну вот, что получается в итоге: cоздать функцию я могу, могу даже дать ей прототип чере _proto_, но это не кроссбраузерно, а чтобы сделать кроссбраузерно, надо использовать фабрику(функция конструктор). Но в ней я столкнулся с трудностью, что либо я не могу сделать this = function..., либо прототип не цепляется:
function factoryTest() {
    return function(name) {
        console.log('Привет', name);
    };
}
function factoryTestInit() 
{   
    var test = new factoryTest();
    test.propetry = 'Свойство';
    console.log([test]); //выведет массив, где 0 элементом будет функция из конструктора, однако функции deleteProp из прототипа тут не будет
    return test;
}
factoryTest.prototype.deleteProp = function() {
    if('property' in this)
        delete this.property
    return;
};
var testObj = new factoryTestInit();

Вот, если в консоли посмотрть на возвращаемую конструктором функцию, то прототип не прокинулся.
Однако, если попробовать следующий код:
var test = function() {
  console.log('Test');  
};
test.property = 'Свойство';
test.__proto__.secondTest = function() {
    console.log('Test second');
};

test();
test.secondTest();
console.log(test.property);

То всё будет работать как надо.

Т.е. в ручную и не кроссбраузерно я могу написать себе функцию и прокинуть к ней прототипы, а вот возможно ли это сделать через фабрику(функцию конструктор) - загадка.

Последний раз редактировалось Splik, 17.06.2015 в 16:45.
Ответить с цитированием