看到后面发现有一个不懂的地方:
为了实现红框内的兼容:
其中红框圈出的代码小弟不是很懂,希望有大神能够指点一二
A small problem in using native JavaScript to implement bind? -PHP Chinese website Q&A-A small problem in using native JavaScript to implement bind? -PHP Chinese website Q&A
Let’s take a look and learn.
搞了好久细节,终于搞清楚了跟你说说,也在这里做个笔记,不是很会描述,见谅:
首先,先看bind文档,经过bind的方法,如果使用new的话,会忽略bind的context,而是用新生成的实例对象作为this。
其次,再看看instanceof的文档,instanceof返回的结果是: 原型链中是否存在一个构造函数的 prototype 属性。
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
所以,这里用F先保存当前的prototype,然后通过bound.prototype = new F()让bound继承this.prototype里面的属性,而通过new bound()生成的对象的原形链中就会含有this.prototype。举个栗子说明继承原形链:
function fn(a,b,c) { console.log(this) }; fn.prototype.test1 = function(){ console.log("test1"); }var fn1 = fn.bind(1);var instance = new fn1(); instance.test1(); // 输出:test1,说明fn1继承了fn.prototype上面的属性
最后,由于是通过bound.prototype = new F(),所以当使用new的时候,this instanceof F会返回true。那么就会把方法内部的this绑定成当前的实例,就达到了上面第一条说的效果
几个问题:
下面的都是前辈们指出来的,所以我非原创,不拿任何credit。
他的这个栗子其实已经很好地实现了需要,不过吹毛求疵一点,讨论两个问题:
第一个问题:使用context||this是否合理?作者的目的是在不使用new的情况下,没有传入context时,使用自己的this代替。这个其实有点多此一举,首先fn.apply(undefined)也是可以的。而且当对fn使用严格模式的时候,会出现this指向window的问题,应该是undefined。
function fn() { 'use strict'; console.log(this); } fn.bind()(); // 应该是undefined,但是栗子中的bind会返回window
第二个问题:使用F来传递原形的属性,而不是直接通过bound.prototype = this.prototype,我看原作者说的是为了防止污染this,但是我没有理解怎么污染this的。反而会造成下面的问题:
function fn(){ console.log(this) };var fn1 = fn.bind(1); var instance = new fn1();console.log(instance.__proto__ === fn.prototype); // 原生的bind应该返回true,而文中bind的栗子返回的是false
A small problem in using native JavaScript to implement bind? -PHP Chinese website Q&A-A small problem in using native JavaScript to implement bind? -PHP Chinese website Q&A
Let’s take a look and learn.
搞了好久细节,终于搞清楚了跟你说说,也在这里做个笔记,不是很会描述,见谅:
首先,先看bind文档,经过bind的方法,如果使用new的话,会忽略bind的context,而是用新生成的实例对象作为this。
其次,再看看instanceof的文档,instanceof返回的结果是: 原型链中是否存在一个构造函数的 prototype 属性。
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
所以,这里用F先保存当前的prototype,然后通过bound.prototype = new F()让bound继承this.prototype里面的属性,而通过new bound()生成的对象的原形链中就会含有this.prototype。举个栗子说明继承原形链:
最后,由于是通过bound.prototype = new F(),所以当使用new的时候,this instanceof F会返回true。那么就会把方法内部的this绑定成当前的实例,就达到了上面第一条说的效果
几个问题:
下面的都是前辈们指出来的,所以我非原创,不拿任何credit。
他的这个栗子其实已经很好地实现了需要,不过吹毛求疵一点,讨论两个问题:
第一个问题:使用context||this是否合理?作者的目的是在不使用new的情况下,没有传入context时,使用自己的this代替。这个其实有点多此一举,首先fn.apply(undefined)也是可以的。而且当对fn使用严格模式的时候,会出现this指向window的问题,应该是undefined。
第二个问题:使用F来传递原形的属性,而不是直接通过bound.prototype = this.prototype,我看原作者说的是为了防止污染this,但是我没有理解怎么污染this的。反而会造成下面的问题: