Discuss / JavaScript / 关于装饰器

关于装饰器

Topic source

象橼科技

#1 Created at ... [Delete] [Delete and Lock User]

理解

利用apply()能改变函数的指向这一特性,在不修改源码的基础上实现功能的扩展

0.var oldParseInt = parseInt; 保存原函数 因为要重写parseInt函数 如果不保存原函数直接在里面使用parseInt会造成无限调用我自己

1.window.parseInt = function () {...}; 重写parseInt函数

2.count += 1; 在重写的函数内部实现的功能扩展

3.return oldParseInt.apply(null, arguments); 返回原函数调用结果

4.`apply`方法,它接收两个参数,第一个参数就是需要绑定的`this`变量,第二个参数是`Array`,表示函数本身的参数。

5.这里的arguments就是重写后的函数的参数 把重写后的函数的参数给了oldParseInt作为oldParseInt的参数

6.null是指需要绑定的`this`变量 这里写的是null 因为parseInt是window的方法 所以也可以写window

所以为什么可以用null代替window? 不是很理解

Up.

#2 Created at ... [Delete] [Delete and Lock User]

function的this指向obj,null则指向全局

好比 1+1 =2,语言的规定就是这样,不用理解

Xxxxh

#3 Created at ... [Delete] [Delete and Lock User]

这里用null的原因前面说到过了,对于普通函数调用,我们通常把`this`绑定 `null`,parseInt()就是一个普通函数并不是方法。

我不能理解的是为啥要用apply调用oldParseInt()?直接return oldParseInt(arguments)也完全没有任何问题啊,功能也能实现。

Vincent

#4 Created at ... [Delete] [Delete and Lock User]

有没有可能js中根本没有普通函数,全部是方法呢?

js中不是一切皆对象吗,那哪来的普通函数呢?普通函数也就是window的方法吧?

Out

#5 Created at ... [Delete] [Delete and Lock User]

我也觉得,应该没有普通函数。这里的apply方法和Java反射中method知识点很像了,apply方法就如同Java中的method.invoke()。

Out

#6 Created at ... [Delete] [Delete and Lock User]

相比使用return oldParseInt(arguments),还是依赖于传统的对象主动调用 方法,而使用apply则将调用方法的主动权交给该方法,同时具体执行该方法的对象可以视传入的形参决定,增加了代码的复用性,同时也松耦合了。

Out

#7 Created at ... [Delete] [Delete and Lock User]

这里再补充一点吧:同时具体执行该方法的对象可以视传入的形参决定,即可以选择给拥有该方法的一类对象添加扩展功能,达到了增加了代码的复用性,同时也松耦合了。


  • 1

Reply