2013-10-08 4 views
0

Я пытаюсь научиться использовать protoyping в js.создать объект прототип вызываемого объекта и функции

Первая проблема:

Я хочу сделать функцию, как $() в JQuery. Когда я называю это Jo("header h1"), он работает, но не тогда, когда я звоню Jo.infos().

var Jo = function(selector){ 

    return new Jo.init(selector); 

}; 

Jo.prototype = { 
    infos: function(){ 
     return "Hello! I'm Jo, I'm here to make your life easier"; 
    } 
}; 

Jo.init = function(selector){ 

    this.selector = selector; 

}; 

Где моя ошибка, как ее исправить?

Вторая проблема:

Возвращаемый объект Jo.init, но я хочу Jo.

ответ

0

Я, наконец найти свое решение:

(function(window, undefined){ 

    var Jo = function(selector, context){ 
     return new Jo.fn.init(selector, context); 
    }; 

    Jo.fn = Jo.prototype = { 
     Jo: "0.1", 
     constructor: Jo, 
     init: function(selector, context){ 

      console.log("$() request work"); 

     } 
    }; 

    Jo.infos = function(){ 

     console.log("info work"); 

    }; 

    Jo.fn.init.prototype = Jo.fn; 

    if(typeof window === "object" && typeof window.document === "object") window.Jo = window.$ = Jo; 

})(window); 
-1

__proto__ является объектом, который используется в цепочки поиска, чтобы решить методы

prototype является объектом, который используется для создания __proto__ при создании объекта с новым

var Jo = function(selector){ 
    return new Jo.init(selector); 
}; 

Jo.__proto__= {     //<--------------------- __proto__ 
    infos: function(){ 
     return "Hello! I'm Jo, I'm here to make your life easier"; 
    } 
}; 

Jo.init = function(selector){ 

    this.selector = selector; 

}; 
+0

Try 'Джо InstanceOf Function' – Bergi

1

Там нет необходимости используйте __proto__ который не является стандартным. Используйте это:

var Jo = function(selector){ 
    this.init(selector); 
}; 

Jo.prototype = { 
    infos: function(){ 
     return "Hello! I'm Jo, I'm here to make your life easier"; 
    }, 
    init : function(selector){ 
      this.selector = selector; 
    }, 
    constructor : Jo //reset constructor, because we are using object literal which override the original prototype object 
}; 
var jo = new Jo('jojo'); 
console.log(jo instanceof Jo); //return true 
console.log(jo.infos()); //display the Hello.... 

В вашем коде экземпляр, который вы создали это экземпляр Jo.init, потому что вы вернуть новый объект явно. Таким образом, этот экземпляр не имеет доступа к прототипу Джо.

0

Вам необходимо установить prototype вашего фактического конструктора, Jo.init, прототипу объекта, который вы собираетесь использовать. Кроме того, если вы хотите вызвать Jo.infos() на самой функции Jo, а не на экземпляры, вам придется поместить его туда, а не на прототипе.

function Jo(selector) { 
    return new Jo.init(selector); 
} 
Jo.init = function(selector) { 
    this.selector = selector; 
}; 
Jo.init.prototype = Jo.prototype = { 
    // instance methods here 
    … 
} 

Jo.infos = function(){ 
    return "Hello! I'm Jo, I'm here to make your life easier"; 
}; 

Без дополнительной init функции:

function Jo(selector) { 
    if (! (this instanceof Jo)) return new Jo(selector); 

    this.selector = selector; 
} 
Jo.prototype = { 
    // instance methods here 
    … 
} 

Jo.infos = function(){ 
    return "Hello! I'm Jo, I'm here to make your life easier"; 
}; 
Смежные вопросы