分享

JavaScript中的不可见数据类型

 quasiceo 2015-06-10

JavaScript中的不可见数据类型

JS提供了一些内置对象、函数和构造器供我们编程,如Math、parseInt、Object、Array等。这些都是可见的,编程时可以使用的。比如我可以new Object 或 new Array。

 

有一些则是不可见的,这些对象只能由引擎在特殊的情形提供。这些类型的对象往往还被消减了一些功能。下面列举一些

 

一、Arguments 类型

Arguments 类型 不能由程序员手动创建其对象,即你不能 new Arguments() 。 它有且仅有一个对象arguments

1
2
3
4
5
function func() {
    console.log(arguments[0])     // 1
    console.log(arguments.length) // 3
}
func(1, 2, 3)

arguments对象是在函数调用的时候创建的,只在函数内部可见和使用。可以看到arguments很象Array,可以按索引取元素,也有length属性。但它不是Array,它没有Array的有一些方法比如push、pop等。Arguments 在ES5 10.6 里定义。

 

二、bind返回的函数很特殊

bind是ES5给Function.prototype新增的一个方法,它和call/apply一样在function上直接调用。它返回一个指定了上下文和参数的函数。

1
2
3
4
5
6
function func(age) {
    console.log('name: ' + this.name + ', career: ' + age)
}
var person = {name: 'John McCarthy'}
var f1 = func.bind(person, 'computer scientist')
f1() // name: John McCarthy, career: computer scientist

可以看到返回的函数f1和普通函数一样使用小括号执行调用了。 一切正常,但下面的代码会让你大跌眼镜

1
2
3
4
5
6
function func(age) {
    console.log('name: ' + this.name + ', career: ' + age)
}
var person = {name: 'John McCarthy'}
var f1 = func.bind(person, 'computer scientist')
console.log(f1.prototype) // undefined

和上面代码比较,就最后一句不同,没有执行f1(),而是打印出f1.prototype,发现是undefined。

奇怪吗? 每个function不都有一个prototype属性吗,这是用来实现原型继承的哦。的确,bind返回的function比较特殊,它没有prototype。这种特殊的函数是由JS引擎创建的,客户端程序员没法通过函数声明或函数直接量得到。

 

这一点在规范里有明确提示 ES5 15.3.4.5

 

 

三、大家补充...

 

 

 

posted on 2013-11-20 07:14 snandy 阅读(737) 评论(6) 编辑 收藏

评论

#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  

@woshikay
prototype具体指什么?如果是构造器的prototype,有的是Object的实例,有的则是Function的实例。

F12有的是?烦请列举。
  

#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;
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多