2013-03-15 66 views
1

嗯,我覺得這很有趣,當然,如果我想深入瞭解這些代碼,我肯定會知道他們是如何做到的。我在說的是JQuery庫。看看下面的代碼 -智能javascript jquery對象

$.prototype.mymethod=function(str){ 
    alert(str); 
} 

//now call the added method 
$(document).mymethod('hello') //alert out hello 

如果$是一個純正常的JavaScript函數 (不使用jQuery庫),增加的方法不會如預期,除非new關鍵字$

new $(document).mymethod('hello') 
之前前置工作

但是用jQuery,new關鍵字非常可選!

有人可以給我們更多的見解,他們如何做到這一點,而無需我通過他們的圖書館?

編輯: 一個艱苦的奮鬥之後,終於讓我挖出來的上述工作原理(構造 JavaScript對象 不使用new 關鍵字)的實際根源的機制!我相信這將成爲任何渴望學習advanved javascript的人的好參考!

function a(){ 
    return a.prototype; 
} 
a.prototype.fn=function(){ 
    alert('hello') 
} 

a.prototype.test=123; 

console.log(a().test)//123 
a().fn()//alerts out hello 

回答

3

source code

jQuery = function(selector, context) { 
    // The jQuery object is actually just the init constructor 'enhanced' 
    return new jQuery.fn.init(selector, context, rootjQuery); 
}, 

new,當你調用$(document)已經調用。

如果你想要做同樣的事情jQuery的方式,這裏怎麼會這樣:

var A = function(str){ 
    return new A.prototype.init(str); 
} 
A.prototype.init =function(str){ 
    this.str = str; 
    return this; 
}; 
A.prototype.init.prototype = A.prototype; 

A.prototype.f = function(arg){ // add your function 
    console.log(this.str+' '+arg); 
}; 
A('hello').f('world'); // logs "hello world" 
A('bye').f('bye'); // logs "bye bye" 
+0

@ spaceman12:沒有什麼特別的地方。只需創建一個函數,該函數在被調用時創建一個新對象並將其返回。例如:'function A(){return new B(); }'。 – 2013-03-15 18:38:35

+0

但是,如果我想將方法​​添加到'A'而不是B,並將其稱爲A()。mymethod(),那麼您將如何返回新創建的A對象? – spaceman12 2013-03-15 18:47:02

+0

對於A而不是A返回的內容,'A()。mymethod()'不會調用'mymethod'嗎?我想你想爲A返回一個新的對象,你需要'A.mymethod()',如果'mymethod'創建一個,它將返回一個新創建的對象... – ckersch 2013-03-15 18:56:31