函数原型 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
存在的意义是在 函数 作为 构造函数 用时(new
或 super
)能复制到生成对象的 __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 权威指南