Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вопрос про наследование (https://javascript.ru/forum/misc/29437-vopros-pro-nasledovanie.html)

noname1990 27.06.2012 22:51

вопрос про наследование
 
В Sanbox.module.dom есть строчка, если parent, то наследовать, когда я создаю новый объект dome, и указываю что нужно наследовать от конструктора Sandbox, то по идее у меня должна сработать функция dome.count(), но тока этого не происходит))) я немного уже запутался, мот кто подскажет в чем проблема?
Sandbox.modules = {};

Sandbox.modules.dom = function (parent) {

    if (parent)
    {
        function F(){};
        F.prototype = parent.prototype;
        Sandbox.modules.dom.prototype = new F();
    }

    this.name = 'AppDom';
    this.getElement = function()
    {
        console.log(this)
    }

}

function Sandbox() {

    var args = Array.prototype.slice.call(arguments),
        callback = args.pop(),
        modules = (args[0] && typeof args[0] === "string") ? args : args[0],
        i

    if (!(this instanceof Sandbox)) {
        return new Sandbox(modules, callback);
    }

    if (!modules || modules === '*') {
        modules = [];
        for (i in Sandbox.modules) {
            if (Sandbox.modules.hasOwnProperty(i)) {
                modules.push(i);
            }
        }
    }

   
    callback(this);

}

Sandbox.prototype.count = function(){alert('count')};
new Sandbox(['dom'], function(Modul)
{
    var dome = new Sandbox.modules.dom(Sandbox);
    dome.count();
});

nerv_ 28.06.2012 00:16

noname1990, что-то ты все делаешь да не то )

1. где недостающие точки с запятой?
2.
var dome = new Sandbox.modules.dom(Sandbox);

конструкторы пишутся с заглавной буквы
3. count - метод прототипа функции Sandbox, откуда ему взяться у Sandbox.modules.dom?

Sandbox.modules = {};

Sandbox.modules.dom = function (parent) {

    // этот участок напоминает какую-то ерунду
    if (parent)
    {
        function F(){};
        F.prototype = parent.prototype;
        Sandbox.modules.dom.prototype = new F();
    }

    this.name = 'AppDom';
    this.getElement = function()
    {
        console.log(this)
    }

};

function Sandbox() {

    var args = Array.prototype.slice.call(arguments),
        callback = args.pop(),
        modules = (args[0] && typeof args[0] === "string") ? args : args[0],
        i;

    if (!(this instanceof Sandbox)) {
        return new Sandbox(modules, callback);
    }

    if (!modules || modules === '*') {
        modules = [];
        for (i in Sandbox.modules) {
            if (Sandbox.modules.hasOwnProperty(i)) {
                modules.push(i);
            }
        }
    }

   
    callback(this);

}

Sandbox.prototype.count = function(){alert('count')};
var x = new Sandbox(['dom'], function(Modul)
{
    var dome = new Sandbox.modules.dom(Sandbox);
    //dome.count();
});

x.count();

noname1990 28.06.2012 00:40

ну а в том участке, который напоминает тебе ерунду)) разве не должен протопит doma наследовать от Sandbox?

oneguy 28.06.2012 00:57

Дело в том, что когда создаётся новый объект оператором new, то ему присуждается прототип, равен значению свойства prototype конструктора перед выполнением конструктора. Последующее изменение свойства prototype конструктора не влияет на прототип новосозданного объекта.
В данному случае при выполении 48-ой строчки перед началом выполения конструктора, то есть функции Sandbox.modules.dom Sandbox.modules.dom.prototype был равен своему начальному значению, а изменился он лишь в 9-ой строчке.

noname1990 28.06.2012 01:31

Привелико благодарю, буду знать на будущее!


Часовой пояс GMT +3, время: 23:10.