使用原生JavaScript实现bind中的一个小问题?
check
check 2017-03-16 09:35:27
0
2
1263

看到后面发现有一个不懂的地方:

10.png

为了实现红框内的兼容:

11.png

其中红框圈出的代码小弟不是很懂,希望有大神能够指点一二

check
check

reply all(2)
数据分析师

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


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template