2015-06-03 71 views
1

我嘗試實現一個功能,例如MyFn()具有以下一些功能:
1. MyFn('Id')>它必須是document.getElementById('Id')的值的結果。
2. MyFn('Id')。MyMethode();>它必須是一個函數的執行結果。
下面這個由「Object.prototype中」來實現如下:
如何在JavaScript中使用擴展功能編寫函數?

Object.prototype.MyFn =function(param1){ return document.getElementById(param1); }; 
alert(MyFn('mydiv1')); 
MyFn('mydiv1').posi = function() { alert("Hello, I'm the function posi!"); }; 
MyFn('mydiv1').posi(); 
alert(MyFn('mydiv1')); 

就在上面的例子就是我想實現。但我不想使用Object.prototypejQuery
下面是我的錯方法(這也許是有益正是我想說的還是做):

var MyObj = { 
    method: function(args, callback) { 
     if(typeof callback == "function") { 
      callback(); 
     } 
     return 123; 
    } 
} 

MyFn = function(sId) { 
    return MyObj; 
}; 

alert(MyFn("mydiv1").method()); // This is ok, because it calls the method: MyObj.method() as it was expected. 
alert(MyFn("mydiv1")); // <-- But here I like to get document.getElementById("mydiv1"). 

注:語法的代碼(功能如何調用)很重要!該功能是撥打如下:MyFn(「元素ID」)或MyFn(「元素ID」)POSI(),而不是如下:MyObj.MyMethode()
你有任何想法如何能我意識到了嗎?提前致謝。

+3

您不能從具有相同輸入的單個函數返回2個不同的結果。您要麼返回HTMLElement對象,要麼返回自己的對象。 'MyFn(id)'將總是返回**相同的結果** - 不管你以後想怎麼做(例如'.method()') – Amit

+0

沒錯!但是我想以某種方式實現某些東西,正如我上面所解釋的。例如jQuery做類似的事情。例如。 $('#Id')和$('#Id')。position()。left。 – user3815508

+1

jQuery不返回HTMLElement。它返回一個包含很多功能的jQuery包裝器對象(比如'position()')。當你想要執行元素時,你可以調用'.get()'。 – Amit

回答

0

醜陋的,而不是由幾乎所有的設計百通recomended,但應該工作:

MyFn = function(sId) { 
    var obj = document.getElementById(param1); 

    obj.method = function(args, callback) { 
     if(typeof callback == "function") { 
      callback(); 
     } 
     return 123; 
    } 
    return MyObj; 
}; 

Basicly你manualy添加函數的對象。

這不是一個好德興百通作爲外部人無法事先知道物體有一個額外的方法。

0

這是一個有點哈克解決方案:

var MyObj = function (id) { 
    var obj = document.getElementById(id); 
    // attach functions here 
    obj.myFun = function() { 
     // ... 
    } 
    // ... 
    return obj; 
} 

你得到的對象,附上自己的函數對象(希望沒有重新定義現有的),然後返回。

1

你可以嘗試這樣的:

var MyObj = { 
    method: function(args, callback) { 
     if(typeof callback == "function") { 
      callback(); 
     } 
     return 123; 
    } 
} 

var MyFn = function(sId) { 
    this.elem = document.getElementById(sId); 
    this.MyObj = MyObj; 
    return this; 
}; 

alert(MyFn("mydiv1").MyObj.method()); 
alert(MyFn("mydiv1").elem); 

這個返回函數的引用,該函數執行後,所以提供了語法很像C#擴展方法例如。

+0

幾乎是我想要實現的。我想用一些小技巧和一些函數,比如.apply(),.call()或.bind()可以完成。但我不知道如何:) – user3815508

+0

是的,你可以使用MyFunc.call(MyObj)將對象添加到函數對象中。 JavaScript是所有關於技巧,這就是爲什麼我喜歡它:) – Alex

1

應該是相當直接的,看功能也是對象。
的方式它通常做,和jQuery做它的方式,是返回的功能,這是一個簡單的檢查

function MyFn(selector, context) { 

    if (!(this instanceof MyFn)) { // not an instance 

     return new MyFn(arguments); // calls itself with the "new" keyword 

    } else { // now it is an instance 

     context = context || document; 
     this[0] = context.getElementById(id); 
    } 

    return this; 
} 

上,現在建設完成的新實例,我們可以添加方法,但需要原型他們,這是要做到這一點無論如何

MyFn.prototype.width = function() { 
    return this[0].style.width; 
} 

,甚至使可鏈接

MyFn.prototype.width = function(width) { 

    if (width) { 
     this[0].style.width = width + 'px'; 
     return this; 
    } else { 
     return this[0].style.width; 
    } 

} 

0123這些方法的正確方法

+0

1.我可以調用一個函數,如alert(element.width()); 2.我可以得到id alert(元素[0] .id); 3.我可以得到如下參考:alert(MyFn('mydiv1')[0]); 非常好。但是如果可以消除「[0]」,它會更好。也許有一些小技巧和一些函數,如.apply(),.call()它.bind()它可以完成。 :) – user3815508

+0

是的,你可以在某些情況下消除'[0]',例如jQuery爲許多方法執行此操作,它會自動使用集合中的第一個元素,並且還提供諸如'eq'的方法來選擇集合中的某個元素。你當然可以用'this.elem'替換'[0]',如果你只有一個元素,但元素必須存儲在某個地方,否則不能直接返回將不可鏈接,對象實例必須返回來執行此操作。 – adeneo