Category: 前端

JavaScript中Function作为类构造函数时的返回值

function a(){ return this.test(); }; a.prototype.test = function(){ return { a:”12345″ }} var obj = new a(); alert(obj.test); 如果在函数a中不return这个对象,obj会不意外地继承test方法,也就是成为a.prototype的一个指针。但是如果return了,new出来的对象将断开与prototype的链接,变成了一个毫不相干的玩意。 请各位童鞋注意这个问题。 其实,js就不是我们通常所讲的面向对象语言,它没有类的概念。现在的所有的实现js的oo的写法,都是基于js的基于原型继承的面相对象的特性,按照一般概念上的类的写法仿制的。如果又按照一般概念上的类和对象的特点去理解使用它的话,掉到坑里是迟早的事情。 希望各位童鞋在学习js的时候,注意力要放在原型继承上,并在此基础上来考虑new的问题。

模拟私有属性的一个不成熟的办法

抛砖引玉,希望能得到更好的办法来模拟私有属性。

根据userAgent获取浏览器信息

我觉得,无论userAgent多复杂多麻烦,我还是更相信它。至少,世界上没有两个相同的userAgent。 另外,作为一个痴迷于js痴迷于前端的人,我无视360浏览器、遨游、世界之窗、搜狗等诸多产品,我觉得我一直坚持兼容IE6就已经很蛋疼了。 那么,首先,我们搜集一下各个主流浏览器当前版本的userAgent样本,以便做进一步的分析整理。 Chrome 9 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Chrome/9.0.570.0 Safari/534.11 Opera 11 Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.7.62 Version/11.00 Safari 5 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Firefox 3 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) ...Read More

javascript中的引用与闭包

javascript真是神奇的语言,实在是太灵活了。 javascript中的变量,大体分为两大种。 “直接量”和”引用量”,姑且这么称呼吧,肯定不标准。 :) “直接量”包括,number,string,boolean 除此之外,都是”引用量” 有很多JS的面试题,都在这里搞点花样。 var a=[1,2,3]; var b=a; a[0]=2; console.log(b[0]); 结果:2 深入的理解这段代码。 var a=[1,2,3]; var b=a; 看起来似乎是把数组赋值给a了,其实不然,应该是a引用了数组[1,2,3] , 可以这么理解。内存中存在了一个数组[1,2,3],而变量a其实只是保存了一个对数组[1,2,3]的引用罢了。 那么,b=a就好理解了,b只是复制了这种引用。 所以a[0]的重新赋值,会让b[0]也随着改变。 因为a和b本来就引用了同一个数组。 而如果是直接量的,就不会存在这样的情况。 var a=”hello”; var b=a; a=1; console.log(b); 结果:hello ——————————————————————————————————— 有的时候,需要复制而不是引用,就麻烦了。 var a={attr:1}; 如果需要复制一个a。。怎么办呢? function copy(o){ var obj={}; for(var i in o){ obj[i]=o[i]; } return obj; } 没错,生成一个对象,然后把被复制的对象的所有属性都拷贝一份到新的对象里。。 当然,如果你要拷贝一个数组,就要new一个Array,拷贝一个function,就要new一个Function, ————————————————————————————————————————————– 引用,各种引用,各种各种引用,JS就是由引用组成的。 ...Read More

仿cSharp的String.Format方法,在JavaScript中向String类型添加format方法

cSharp中的String.Format方法,是推荐的对字符串进行拼接方法。比如 string hrefFormat = “<a href=”\” target=”\”_blank\”">{1}</a>”; string hrefHtml = String.Format(hrefFormat, “http://xxx.com”, “链接一”); String.Format的第一个参数为格式化的字符串,后面参数为params不定个数、不定类型,根据索引对应标记{0},{1},{2}… 如果参数个数小于标记最大值或标记不以{0}为最小标记,即会抛出错误 当然,除此之外还有对特定数据类型的专用格式化功能。 当前在muselite库中,主要是采用类似cSharp的字符串格式化写法,实现字符串拼接的功能。代码如下: if (!String.prototype.format) String.prototype.format = function () { if (arguments.length == 0) return this; var _ = this, len = arguments.length, i = 0, regExp; for (; i < len; i++) { regExp = new RegExp(‘\\{‘ + i + ...Read More

关于arguments

今天在群里面,蚂蚁问了一些关于this和arguments的问题,把我所认识的arguments总结一下。 当函数内的执行域生成时,arguments对象就被创建了。 arguments对象由所在函数的CreateArgumentsObject方法创建。 这个方法生成了arguments对象,主要是一个list,包含了函数的实参。与函数的形参没有关系,使得不定参数个数的函数成为可能。 例如: function sum(){ var result=0; for(var i=0;i<arguments.length;i++){ result+=arguments[i]; } return result; } console.log(sum(1,2,3,4)); 结果是10 上文中用了arguments的一个属性length,这个属性的值等于实参的个数。 除此之外,arguments还有个重要的属性,callee arguments.callee指向函数本身 听起来似乎不好理解。 function ex(){ console.log(arguments.callee); } ex(); 结果: function ex(){ console.log(arguments.callee); } 说arguments.callee指向了函数本身。。 这一点很有用,特别在匿名函数的递归中。 var s=function(i){ if(i==1){ return 1; } return i*arguments.callee(i-1); } console.log(s(3)); 结果:6 arguments是一个对象,虽然它像一个数组一样,有length属性,也用数字做下标来表达成员。 有些人将这类的对象,称之为类数组。 function a(){ console.log(arguments instanceof Array); console.log(arguments instanceof Object); ...Read More

javascript中的for in

为了获得Object中的方法或属性,就不得不用到for in来遍历。 <script> var eObj={ “a”:1, “b”:2 } for(var i in eObj){ console.log(i); } </script> 结果,输出a,b 同样的,for in 也会枚举出[[prototype]]中的属性 <script> var fn=function(){} fn.prototype.e=1; fn.prototype.f=2; var obj=new fn(); for(var i in obj){ console.log(i); } </script> obj的属性来自于fn.prototype,依然可以被枚举到 结果e,f 然后看下面一种情况。。 枚举的过程中,删除属性。。。 obj={e:1,f:2,g:3}; for(var i in obj){ if(i==”e”){ delete obj.g; } console.log(i); } 在for in的过程中,删除了其中的一个属性g,则被删除的属性不会被枚举出。。 结果是:e,f 那么,如果删除的是已经被枚举到的属性呢? obj={e:1,f:2,g:3}; for(var ...Read More

javascript中的new操作符

javascript中的new