我的问题很奇怪,它与我在jQuery中看到的东西有关,但到目前为止我一直无法重新创建它。
在jQuery中你可以像这样jQuery('div').append
或
jQuery.ajax
我正在制作的应用程序需要类似的语法,我注意到你使用新的
var that=new function(){
}
你可以在没有()的情况下调用函数,但在某些情况下我需要它。
原因是我需要选择一个dom元素,就像jQuery一样。
that('[data-something="this"]').setEvent('click',functin(){})
有些人自动这样做:
that.loadIt('this','[data-something="that"]')
原因是dom元素在外部加载并被推送,然后脚本在继续之前等待它准备就绪。这样做,对我来说无论如何似乎是最干净的方式来获得这个功能(我正在编写一个完整的javascript框架,所以我避免使用库来保持脚本快速)
答案 0 :(得分:5)
函数是对象,可以具有属性,就像其他对象一样。因此,您可以向这样的函数添加属性:
function myFunc(){}
myFunc.someFunc = function(){}
如果您使用new myFunc
,则生成的对象将不会someFunc
,因为它不属于prototype
。
所以,你可以做这样的事情:
function myFunc(){
// This lets you do "myFunc()" instead of "new myFunc()"
if (!(this instanceof myFunc)) {
return new myFunc();
}
else{
this.val = 0;
this.setVal = function(x){
this.val = x;
// for function chaining
return this;
}
this.getVal = function(){
return this.val;
}
}
}
// This function is not part of the prototype
myFunc.test = function(){
alert('hi');
}
// Some tests
var obj = myFunc();
obj.setVal(12).getVal(); // 12
myFunc.test();
obj.test(); // Error: 'test' is not a function
myFunc.getVal(); // Error: 'getVal' is not a function
答案 1 :(得分:5)
功能是对象。
只需删除new
,然后将属性直接添加到that
。
var that = function() {
// do some work
}
that.loadit = function() {
// do other work
}
既然你正在努力实现像jQuery那样的东西,那么让that
调用一个构造函数。
;(function(global) {
// function to be publicly exposed
var that = function(foo, bar) {
return new MyLibrary(foo, bar);
}
// publicly expose the function
global.that = that;
// use the function as a namespace for utilities
that.loadit = function() {
// do other work
}
// The actual constructor function, like the internal jQuery constructor
MyLibrary(foo, bar) {
// constructor function
}
// Prototypal inheritance of objects created from the constructor
MyLibrary.prototype.setEvent = function() {
// do some work
return this; // allows for method chaining
};
MyLibrary.prototype.otherMethod = function() {
// do something else
return this; // allows for method chaining
};
})(this);
答案 2 :(得分:0)
$.fn.loadIt=function(var1,var2) {
// $(this) is automatically passed
// do stuff
}
像这样称呼它
$('#element').loadIt('a variable','another variable');