2015-06-03 44 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