JavaScript中的不可见数据类型JS提供了一些内置对象、函数和构造器供我们编程,如Math、parseInt、Object、Array等。这些都是可见的,编程时可以使用的。比如我可以new Object 或 new Array。
有一些则是不可见的,这些对象只能由引擎在特殊的情形提供。这些类型的对象往往还被消减了一些功能。下面列举一些
一、Arguments 类型Arguments 类型 不能由程序员手动创建其对象,即你不能 new Arguments() 。 它有且仅有一个对象arguments
arguments对象是在函数调用的时候创建的,只在函数内部可见和使用。可以看到arguments很象Array,可以按索引取元素,也有length属性。但它不是Array,它没有Array的有一些方法比如push、pop等。Arguments 在ES5 10.6 里定义。
二、bind返回的函数很特殊bind是ES5给Function.prototype新增的一个方法,它和call/apply一样在function上直接调用。它返回一个指定了上下文和参数的函数。
可以看到返回的函数f1和普通函数一样使用小括号执行调用了。 一切正常,但下面的代码会让你大跌眼镜
和上面代码比较,就最后一句不同,没有执行f1(),而是打印出f1.prototype,发现是undefined。 奇怪吗? 每个function不都有一个prototype属性吗,这是用来实现原型继承的哦。的确,bind返回的function比较特殊,它没有prototype。这种特殊的函数是由JS引擎创建的,客户端程序员没法通过函数声明或函数直接量得到。
这一点在规范里有明确提示 ES5 15.3.4.5
三、大家补充...
分类: JavaScript
评论#1楼 2013-11-20 09:55 zmcnxd
不可见“数据类型”这个叫法似乎不妥
#2楼[楼主] 2013-11-20 11:17 snandy
@zmcnxd
应该叫什么? #3楼 2014-02-08 16:06 woshikay
还有portotype等等等按下F12有的是~
#4楼[楼主] 2014-02-08 22:23 snandy
#5楼 2014-02-08 22:53 woshikay
@snandy
是啊~OBJECT或者是FUNCTION的还有一个什么构造函数~也是每个都带的~在chrome里F12然后检测一个一个变量的值就会出现很多很多的属性~有的可以用有的不可以用~ #6楼 2015-01-12 01:12 JS牡丹
请参考如下 bind 方式 if( !Function.prototype.bind2 ){ Function.prototype.bind2 = function( obj ){ if ( typeof obj !== "object" && typeof obj !== "function" ){ return false; } var args = arguments, obj = obj === this || obj instanceof this ? null : obj || window, methodSlice = [].slice, aAgs1 = methodSlice.call( args, 1 ), _this = this, tempFn = function(){ }, bindedFn = function(){ return _this.apply( obj, aAgs1.concat( methodSlice.call( arguments ) ) ) }; tempFn.prototype = this.prototype; bindedFn.prototype = new tempFn(); return bindedFn; } } |
|