给 js MDN 提出关于 Function.prototype
2017-08-05 本文已影响107人
高少辉_骚辉
MDN 原版
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable")
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP
? this
: oThis || this,
aArgs.concat(Array.prototype.slice.call(arguments)))
}
fNOP.prototype = this.prototype
fBound.prototype = new fNOP()
return fBound
}
}
提出修正的版本
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable")
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
fBound.prototype = this instanceof fNOP ? new fNOP() : fBound.prototype
return fToBind.apply(this instanceof fNOP
? this
: oThis || this,
aArgs.concat(Array.prototype.slice.call(arguments)))
}
if( this.prototype ) {
// Function.prototype doesn't have a prototype property
fNOP.prototype = this.prototype
}
return fBound
}
}
提出的修正地方有
第一处
fNOP.prototype = this.prototype
⇩⇩⇩
if( this.prototype ) {
// Function.prototype doesn't have a prototype property
fNOP.prototype = this.prototype
}
此处修改,主要是因为,函数 Function.prototype 是没有 prototype 原型的
ps:可能有些人会奇怪 Function.prototype 不是对象吗?怎么变函数了,不信你可以去控制台打印出来看看
第二处
fBound.prototype = new fNOP()
⇩⇩⇩
fBound.prototype = this instanceof fNOP ? new fNOP() : fBound.prototype
此处修改是因为,原生 bind 函数是在没有使用 new 关键字的时候,是不会暴露出原始函数的 prototype 的
所以我们此处,进行原型继承的时候,是在函数开始执行时候进行的,然后在函数内部判断,如果是使用 new 关键字,则继承,否则不暴露 prototype