当前位置: 首页 > news >正文

浙江省住房城乡建设厅官方网站如何进行网站的宣传和推广

浙江省住房城乡建设厅官方网站,如何进行网站的宣传和推广,扬州疫情最新消息今天封城了,c2b平台经常会看到网上各种手写bind的教程,下面是我在自己实现手写bind的过程中遇到的问题与思考。如果对于如何实现一个手写bind还有疑惑的话,那么可以先看看上面两篇文章。 手写bind vs 原生bind 我们先使用一个典型的手写bind的例子,代码如下&a…

经常会看到网上各种手写bind的教程,下面是我在自己实现手写bind的过程中遇到的问题与思考。如果对于如何实现一个手写bind还有疑惑的话,那么可以先看看上面两篇文章。

手写bind vs 原生bind

我们先使用一个典型的手写bind的例子,代码如下:

Function.prototype.bind2 = function (context) {if (typeof this !== "function") {throw new Error("Function.prototype.bind - what is trying to be bound is not callable");}var self = this;var args = Array.prototype.slice.call(arguments, 1);var fNOP = function () {};var fBound = function () {var bindArgs = Array.prototype.slice.call(arguments);return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));}fNOP.prototype = this.prototype;fBound.prototype = new fNOP();return fBound;
}

我们首先用原生bind运行一下代码

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind(undefined, 'a')
new _Foo() 

原生bind

然后使用手写版代码,运行同样的代码

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind2(undefined, 'a')
new _Foo() 

多一层__proto__

我们可以看到相比原生bind方法,手写版的bind方法返回的构造函数,构造出来的新对象会比原生的多一层__proto__。而这个__proto__产生的原因就是在很多教程中提到的防止原型链篡改

这也就是为什么很多的文章会告诉你,为什么要添加下面的代码。

var fNOP = function () {};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();

这段代码中,使用了一个空函数作为中转,相当于Object.create(fBound.prototype)。具体可以查看文章开头给出的文章,里面的详细的说明。

规范中的bind

既然说道,加上面的代码是为了防止原型链篡改。我就想看看原生的bind如何处理这个问题的呢?参考 前端进阶面试题详细解答

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind(undefined, 'a')
_Foo.prototype.sayHi = function( ) {console.log('篡改的_Foo的sayHi方法')}
(new _Foo().sayHi())

我发现在运行上面的代码,程序执行到修改_Foo的原型方法的语句时,就已经报错了。提示表明_Foo没有prototype属性!既然没有prototype属性,那么是不是也就不用处理原型链篡改的问题了呢?

之后,我查了一下规范, 在NOTE中,有下面一段话。明确指出了bind返回的函数是没有prototype属性,这也多少印证了上面的猜想。

Function objects created using Function.prototype.bind do not have a prototype property or the [[Code]], [[FormalParameters]], and [[Scope]] internal properties.

其中需要注意的有一点是这条:

  1. Set the [[Prototype]] internal property of F to the standard built-in Function prototype object as specified in 15.3.3.1.

我自己理解的意思是是bind出来的函数对象的prototype属性是内建的Function.prototype属性, 这里应该是说明了为什么原生的bind不会多一层__proto__属性

小结

写这篇的目的是总结下自己在实现bind过程中遇到的问题,记录探究的过程。通过一系列手写原生方法,锻炼了我们对于原理的进一步认识。但是也要注意验证,实际去操作几次,可能得出自己的经验。如果有更多的两者对比的发现,可以在评论里告诉我,欢迎各位大佬斧正。

http://www.tj-hxxt.cn/news/6860.html

相关文章:

  • 网站备案号查询网淘宝seo 优化软件
  • 广东品牌网站建设怎么在百度推广自己的公司
  • 站长之家网址查询湖南seo推广多少钱
  • 给你一个网站你如何做优化南宁seo怎么做优化团队
  • 建设外汇网站乔拓云网站注册
  • 中国域名网官网查询seo的推广技巧
  • 精益生产网站开发方案百度关键词点击排名
  • 天津建设注册执业中心网站重庆seo按天收费
  • 计算机专业论文网站开发百度云登录入口官网
  • 甘肃网站制作公司有哪些优化网站首页
  • 专业网页制作平台seo搜索引擎优化案例
  • 建设网站公司专业怎样做引流推广
  • 给企业做网站的好处网站收录查询系统
  • 产品推广策略石家庄seo顾问
  • 香港股市的做空网站他达拉非片和伟哥区别
  • 利用大平台做网站手机百度快照
  • 新闻网站抓取做舆情监测重庆seo推广运营
  • 三站一体网站公司百度平台app
  • 无锡宜兴网站建设企业网站seo方案案例
  • wordpress文章设置seo经典案例
  • 自己做网站的图片白帽优化关键词排名seo
  • 做简历最好的网站搜索引擎外部优化有哪些渠道
  • wordpress添加新的小工具宁波seo推广方式排名
  • 本机iis发布网站后台管理seo排名啥意思
  • 平面设计相关的网站有哪些内容安徽网站推广优化
  • 东莞常平镇房价多少搜索引擎优化的简称是
  • 做衣服招临工在什么网站找沈阳seo网站推广
  • 武汉专业做网站jw100信息流投放平台
  • 阿里云能放企业网站吗广告推广策划
  • 怎样设计自己网站域名抖音搜索seo排名优化