函数具有三种角色:
普通函数
堆栈内存
作用域链
类(构造函数)
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-16
MAX_SAFE_INTEGER: 9007199254740991
MAX_VALUE: 1.7976931348623157e+308
MIN_SAFE_INTEGER: -9007199254740991
MIN_VALUE: 5e-324
NEGATIVE_INFINITY: -Infinity
NaN: NaN
POSITIVE_INFINITY: Infinity
arguments: (...)
caller: (...)
isFinite: ƒ isFinite()
isInteger: ƒ isInteger()
isNaN: ƒ isNaN()
isSafeInteger: ƒ isSafeInteger()
length: 1
name: "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()