函数原型

函数原型 Function.prototype

每一个javascript函数(ECMAScript5 中的 Function.bind() 方法返回的函数除外)都都自动拥有一个prototype属性。这个属性的值是一个对象,这个对象包含唯一一个不可枚举的属性 constructor。constructor的值是一个函数对象,这个函数对象就是该函数本身

var F = function() {};
var p = F.prototype;
var c = p.constructor;
c === F      // true 对于任意函数 F.prototype.constructor === F

bind 一般的用法是 fn.bind(obj),然后返回的是绑定obj内容上下文(this指向obj)的fn。如果obj为空的话,则this指向window,如下:

var age = 50;
var child = { age: 1 }
function getAge() {
  console.log(this.age);
}
var childGetAge = geAge.bind(child);
var _getAge = getAge.bind();
getAge();      // 50
childGetAge()  // 1
_getAge()      // 50

因此,Function.prototype.bind() 其实就是 Function.prototype

测试了一些 javascript 内置函数方法,比如 Object.prototype.toString,依照上面所诉,该函数应该也存在 prototype 属性,但实际返回的是 undefined

typeof Object.prototype.toString      // function
Object.prototype.toString.prototype   // undefined

后查询资料时,在 segmentfault 问答平台看到如下回答:

这句话不能说错,只能算没说完。“默认”确实是这样,但 prototype 只是一个普通属性,可认为设定,__proto__ 才是继承的(虽然也可以修改)。

prototype 存在的意义是在 函数 作为 构造函数 用时(newsuper)能复制到生成对象的 __proto__ 上。对于一些内部方法明确是不会作为 构造函数 的,所以没有 prototype 是很合理的(同时也没有 [[Construct]] 内部属性)。ECMAScript规范中有这样描述:

Built-in functions that are not constructors do not have a prototype property unless otherwise specified in the description of a particular function.非构造函数的内置函数没有prototype属性,除非在特定函数的描述中另有说明。

参考资料:

Javascript 权威指南

pma934的博客

segmentfault问答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值