函数具有三种角色:
普通函数
堆栈内存
作用域链
类(构造函数)
prototype:原型对象__proto__:原型链实例
普通对象
- 和普通的对象那个没啥区别,就是对键值对的增删改查
function Foo() {var n = 10;this.m = 20;}Foo(); //=> 普通函数调用new Foo(); //=> 构造函数调用,作为类Foo.prototype.aa = function () {} //=> 作为类,给类的原型对象添加方法Foo.aa = function () {} //=> 普通对象增加方法,与类和实例无关
以原生 Number 为例:
Number()//=> 前面都是把 Number 当作普通对象,设置的一些内置的键值对//=> 通过 Number.MAX_SAFE_INTEGER 调用,不能使用 1.MAX_SAFE_INTEGER 调用EPSILON: 2.220446049250313e-16MAX_SAFE_INTEGER: 9007199254740991MAX_VALUE: 1.7976931348623157e+308MIN_SAFE_INTEGER: -9007199254740991MIN_VALUE: 5e-324NEGATIVE_INFINITY: -InfinityNaN: NaNPOSITIVE_INFINITY: Infinityarguments: (...)caller: (...)isFinite: ƒ isFinite()isInteger: ƒ isInteger()isNaN: ƒ isNaN()isSafeInteger: ƒ isSafeInteger()length: 1name: "Number"parseFloat: ƒ parseFloat()parseInt: ƒ parseInt()//=> 把 Number 当作类,在它的原型上设置一些公有的属性和方法,供实例调取使用//=> 通过 1.toFixed() 调用,不能通过 Number.toFixed() 调用prototype: Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, toString: ƒ, …}__proto__: ƒ ()[[Scopes]]: Scopes[0]
JQ 这个类库提供了很多的方法,其中有一部分是写在原型上的,有一部分是把它当作普通对象来设置的。
~function () {function jQuery() {//...return [JQ 实例]}jQuery.prototype.animate = function(){}jQuery.ajax = function() {}//..window.jQuey = window.$ = jQuery;}();$().animate();$.ajax()
