ای سی ایم اسکریپت فنکشن اوبجیکٹ (کلاس)
- ਪਿੰਡਾ ਪੰਨਾ arguments ਆਬਜੈਕਟ
- ਅਗਲਾ ਪੰਨਾ ਬੰਦਕਲੇ (closure)
ECMAScript کی فونکشن حقیقی طور پر پورا عناصر کی بنیاد پر بنائی گئی ہیں。
Function عناصر (کلاس)
ECMAScript میں سب سے زیادہ ذوق دینا ممکنہ یہ ہے کہ فونکشن حقیقی طور پر پورا عناصر کی بنیاد پر بنائی گئی ہیں。
Function کلاس کسی بھی فونکشن کو نمائش دے سکتا ہے جو دیکھنے والا نے تعین کردا ہے。
Function کلاس کے ذریعہ فونکشن قائم کرنے کی نمائش مندرجہ ذیل ہے:
var function_name = new function(arg1, arg2, ... , argN, function_body)
ਉੱਪਰੋਕਤ ਰੂਪ ਵਿੱਚ, ਹਰ ਇੱਕ arg ਸਭ ਇੱਕ ਪਾਰਾਮੀਟਰ ਹਨ, ਆਖਰੀ ਪਾਰਾਮੀਟਰ ਫੰਕਸ਼ਨ ਸਾਬਤ (ਚਲਾਉਣ ਵਾਲਾ ਕੋਡ) ਹੈ। ਇਹ ਪਾਰਾਮੀਟਰ ਸਿਰਫ਼ ਚਿੰਨ੍ਹ ਹਨ。
ਯਾਦ ਕਰੋ ਇਹ ਫੰਕਸ਼ਨ?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
ਇਸ ਤਰ੍ਹਾਂ ਵੀ ਦਫ਼ਤਰ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
ਹਾਲਾਂਕਿ ਇਸ ਰੂਪ ਵਿੱਚ ਲਿਖਣਾ ਕੁਝ ਹੀ ਮੁਸ਼ਕਿਲ ਹੈ, ਪਰ ਇਹ ਫੰਕਸ਼ਨ ਇੱਕ ਪੁਨਰਾਵਲੀਬਾਨ ਪ੍ਰਕਾਰ ਦਾ ਹੈ, ਉਹਨਾਂ ਦਾ ਵਿਵਹਾਰ Function ਕਲਾਸ ਰਾਹੀਂ ਬਣਾਏ ਗਏ ਫੰਕਸ਼ਨ ਦੇ ਅਨੁਰੂਪ ਹੈ。
ਇਹ ਉਦਾਹਰਣ ਦੇਖੋ:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //ਆਉਟਪੁਟ "20"
ਤੁਸੀਂ ਜਾਣਦੇ ਹੋ ਕਿ ਦੂਜੀ ਫੰਕਸ਼ਨ ਪਹਿਲੀ ਫੰਕਸ਼ਨ ਨੂੰ ਓਵਰਲੋਡ ਕਰਦੀ ਹੈ, ਇਸ ਲਈ doAdd(10) ਨੇ "20" ਨਾ ਹੋਕੇ "30" ਆਉਟਪੁਟ ਦਿੱਤਾ ਹੈ。
ਜੇਕਰ ਇਹ ਕੋਡ ਇਸ ਤਰ੍ਹਾਂ ਲਿਖਿਆ ਜਾਵੇ ਤਾਂ ਇਸ ਕਾਨੂੰਨ ਨੂੰ ਸਪਸ਼ਟ ਹੋਵੇਗਾ:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
ਇਹ ਕੋਡ ਦੇਖੋ, ਸਪਸ਼ਟ ਹੈ ਕਿ doAdd ਦਾ ਮੁੱਲ ਇੱਕ ਵੱਖਰੇ ਅਧਾਰ ਵੱਲ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਫੰਕਸ਼ਨ ਦਾ ਨਾਮ ਸਿਰਫ਼ ਫੰਕਸ਼ਨ ਦੇ ਅਧਾਰ ਦਾ ਹਵਾਲਾ ਹੈ, ਉਹ ਹੋਰ ਅਧਾਰਾਂ ਦੀ ਤਰ੍ਹਾਂ ਹੀ ਕੰਮ ਕਰਦਾ ਹੈ। ਹੁਣ ਵੀ ਦੋ ਵਾਰਿਆਬਲਾਂ ਨੂੰ ਇਕੇ ਫੰਕਸ਼ਨ ਵੱਲ ਪੁਨਰਾਵਲੀਬਾਨ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //ਆਉਟਪੁਟ "20" alsodoAdd(10); //ਆਉਟਪੁਟ "20"
ਇੱਥੇ ਵਾਰਿਆਬਲ doAdd ਨੂੰ ਫੰਕਸ਼ਨ ਵਜੋਂ ਦਫ਼ਤਰ ਕੀਤਾ ਗਿਆ ਹੈ, ਫਿਰ alsodoAdd ਨੂੰ ਇਸੇ ਫੰਕਸ਼ਨ ਦੇ ਪੁਨਰਾਵਲੀਬਾਨ ਵਜੋਂ ਘੋਸ਼ਿਤ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਨ੍ਹਾਂ ਦੋਵਾਂ ਵਾਰਿਆਬਲਾਂ ਨਾਲ ਫੰਕਸ਼ਨ ਦੇ ਕੋਡ ਨੂੰ ਚਲਾਇਆ ਜਾ ਸਕਦਾ ਹੈ ਅਤੇ ਇੱਕ ਜਿਹਾ ਨਤੀਜਾ ਦਿੱਤਾ ਜਾਵੇਗਾ - "20"। ਇਸ ਤਰ੍ਹਾਂ ਫੰਕਸ਼ਨ ਦਾ ਨਾਮ ਸਿਰਫ਼ ਫੰਕਸ਼ਨ ਦੇ ਵਾਰਿਆਬਲ ਦਾ ਹਵਾਲਾ ਹੈ ਤਾਂ ਫੰਕਸ਼ਨ ਨੂੰ ਦੂਜੇ ਫੰਕਸ਼ਨ ਨੂੰ ਪਾਰਾਮੀਟਰ ਵਜੋਂ ਪਾ ਸਕਦੇ ਹਾਂ ਕੀ? ਜਵਾਬ ਹੈ ਹਾਂ!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //输出 "20"
在上面的例子中,callAnotherFunc() 有两个参数 - 要调用的函数和传递给该函数的参数。这代码把 doAdd() 传递给 callAnotherFunc() 函数,参数是 10,输出 "20"。
注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。
Function 对象的 length 属性
如前所述,函数属于引用类型,所以它们也有属性和方法。
ECMAScript 定义的属性 length 声明了函数期望的参数个数。例如:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //输出 "1" alert(sayHi.length); //输出 "0"
函数 doAdd() 定义了一个参数,因此它的 length 是 1;sayHi() 没有定义参数,所以 length 是 0。
记住,无论定义了几个参数,ECMAScript 可以接受任意多个参数(最多 25 个),这一点在《函数概述》这一章中讲解过。属性 length 只是为查看默认情况下预期的参数个数提供了一种简便方式。
Function ਆਬਜੈਕਟ ਦੀਆਂ ਮੱਥਾਵਾਂ
Function ਆਬਜੈਕਟ ਵੀ ਸਾਰੇ ਆਬਜੈਕਟਾਂ ਨਾਲ ਸਾਂਝੇ valueOf() ਅਤੇ toString() ਮੱਥੋਆਂ ਰੱਖਦੇ ਹਨ।ਇਹ ਦੋਵੇਂ ਮੱਥੋਆਂ ਫੰਕਸਨ ਦੇ ਸੋਰਸ ਕੋਡ ਨੂੰ ਵਾਪਸ ਦਿੰਦੇ ਹਨ, ਜਿਸ ਨੂੰ ਸੁਣਾਈ ਵਿੱਚ ਵਿਸ਼ੇਸ਼ ਰੂਪ ਵਿੱਚ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।ਉਦਾਹਰਣ ਵਜੋਂ:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
ਇਸ ਕੋਡ ਨੇ doAdd() ਫੰਕਸਨ ਦਾ ਟੈਕਸਟ ਪ੍ਰਦਾਨ ਕੀਤਾ ਹੈ。ਸੁਤੰਤਰ ਰੂਪ ਵਿੱਚ ਕੋਸ਼ਿਸ਼ ਕਰੋ!
- ਪਿੰਡਾ ਪੰਨਾ arguments ਆਬਜੈਕਟ
- ਅਗਲਾ ਪੰਨਾ ਬੰਦਕਲੇ (closure)