摘要:
将方法存储在原型中,使其可以被所有的实例使用,而不需要给每个实例对象增加额外的属性。
将方法存储在实例对象中会优化查找速度,当使用如u1.toString()方法,不需要搜索原型链来查找toString的实现。但,现代的js引擎深度优化了原型查找,所以将方法复制到实例对象并不一定保证速度有明显的提升。而且实例方法比起原型方法肯定会占用更多的内存。 阅读全文
摘要:
构造函数覆盖模式,使用new操作符调用该函数的行为就如以函数调用它的行为一样。这能工作完全利益于js允许new表达式的结果可以被构造函数中的显式return语句所覆盖。当User函数返回self对象时,new表达式的结果就变为self对象。该self对象可能是另一个绑定到this的对象。
防范误用构造函数可能并不是太值得去做,尤其是当仅仅是局部使用构造函数时。但是理解如果以错误的方式调用构造函数会造成严重后果很重要。至少文档化构造函数期望使用new操作符调用是很重要的,尤其是在跨大型代码库中其享构造函数或该构造函数来自一个共享库时。 阅读全文
摘要:
__proto__属性很特殊,它提供了Object.getPrototypeOf方法所不具备的额外能力,即修改对象原型链接的能力。 避免修改__proto__属性的最明显的原因是可移植性的问题。并不是所有的平台都支持修改对象原型的特性,所以无法编写可移植的代码。 避免修改__proto__属性的另一 阅读全文
摘要:
ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的。但有些浏览器并不支持这个__proto__属性,所以并不是完全兼容的。例如对于拥有null原型的对象,不同的环境结果就不同了。 阅读全文
摘要:
原型包括三个独立但相关的访问器。这三个单词都是对单词prototype做了一些变化。
C.prototype用于建立由new C()创建的对象的原型
Object.getPrototypeOf(obj)是ES5中用来获取obj对象的原型对象的标准方法
obj.__proto__是获取obj对象的原型对象的非标准方法假设User构造函数需要通过new操作符来调用。它需要两个参数,即姓名和密码的哈希值,并将它们存储在创建的对象中。 阅读全文
摘要:
但不会深究的知识点,分开细化地讲解了。里面很多内容在高3等基础内容里,也有很多讲到。但由于本身书籍的篇幅较大,很容易忽视对应的小知识点。这章里的许多小提示都很有帮助,特别是在看对应内容的时候,把高3等工具书籍放在一边,边查边看收获很大。这章重点围绕函数的相关属性,方法,参数,关键字,命名,柯里化,高阶,闭包等内容作了各种提示。下面只是个人对于各条内容的一些总结,知识面有限,如有不对请大家一定指出。 阅读全文
摘要:
许多js环境都提供检查调用栈的功能。调用栈是指当前正在执行的活动函数链。在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.caller。前者指向使用该arguments对象被调用的函数。后者指向调用该arguments对象被调用 阅读全文
摘要:
js函数有一个非凡的特性,即将其源代码重现为字符串的能力。 反射获取函数源代码的功能很强大,使用函数对象的toString方法有严重的局限性。toString方法的局限性ECMAScript标准对函数对象的toString方法的返回结果(即该字符串)并没有任何要求。这意味着不同的js引擎将产生不同的 阅读全文
摘要:
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行。这使得富有表现力的高阶函数抽象如map和forEach成为可能。它也是js异步I/O方法的核心。与此同时,也可以将代码表示为字符串的形式传递给eval函数以达到同样的功能。
程序员面临一个选择:应该将代码表示为函数还是字符串?
毫无疑问,应该将代码表示为函数。字符串表示代码不够灵活的一个重要原因是:它们不是闭包。 阅读全文
摘要:
将函数与其参数的一个子集绑定的技术称为函数柯里化(curring),以逻辑学家Haskell curry的名字命名。
比起显式的封闭函数,函数柯里化是一种简洁的、使用更少引用来实现函数委托的技术。bind方法提供了一种更简单的实现,结构更简单,但对于不了解bind方法的人理解起来可能有一点难度。 阅读全文