函数具有三种角色:

    • 普通函数

      • 堆栈内存

      • 作用域链

    • 类(构造函数)

      • prototype:原型对象

      • __proto__:原型链

      • 实例

    • 普通对象

      • 和普通的对象那个没啥区别,就是对键值对的增删改查
    1. function Foo() {
    2. var n = 10;
    3. this.m = 20;
    4. }
    5. Foo(); //=> 普通函数调用
    6. new Foo(); //=> 构造函数调用,作为类
    7. Foo.prototype.aa = function () {
    8. } //=> 作为类,给类的原型对象添加方法
    9. Foo.aa = function () {
    10. } //=> 普通对象增加方法,与类和实例无关

    以原生 Number 为例:

    1. Number()
    2. //=> 前面都是把 Number 当作普通对象,设置的一些内置的键值对
    3. //=> 通过 Number.MAX_SAFE_INTEGER 调用,不能使用 1.MAX_SAFE_INTEGER 调用
    4. EPSILON: 2.220446049250313e-16
    5. MAX_SAFE_INTEGER: 9007199254740991
    6. MAX_VALUE: 1.7976931348623157e+308
    7. MIN_SAFE_INTEGER: -9007199254740991
    8. MIN_VALUE: 5e-324
    9. NEGATIVE_INFINITY: -Infinity
    10. NaN: NaN
    11. POSITIVE_INFINITY: Infinity
    12. arguments: (...)
    13. caller: (...)
    14. isFinite: ƒ isFinite()
    15. isInteger: ƒ isInteger()
    16. isNaN: ƒ isNaN()
    17. isSafeInteger: ƒ isSafeInteger()
    18. length: 1
    19. name: "Number"
    20. parseFloat: ƒ parseFloat()
    21. parseInt: ƒ parseInt()
    22. //=> 把 Number 当作类,在它的原型上设置一些公有的属性和方法,供实例调取使用
    23. //=> 通过 1.toFixed() 调用,不能通过 Number.toFixed() 调用
    24. prototype: Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, toString: ƒ, …}
    25. __proto__: ƒ ()
    26. [[Scopes]]: Scopes[0]

    JQ 这个类库提供了很多的方法,其中有一部分是写在原型上的,有一部分是把它当作普通对象来设置的。

    1. ~function () {
    2. function jQuery() {
    3. //...
    4. return [JQ 实例]
    5. }
    6. jQuery.prototype.animate = function(){}
    7. jQuery.ajax = function() {}
    8. //..
    9. window.jQuey = window.$ = jQuery;
    10. }();
    11. $().animate();
    12. $.ajax()