函数的三种角色
- 普通函数
- 堆栈内存释放
- 作用域链
Fn();
- 类
- prototype: 原型
- __ proto __ : 原型链
函数的三种角色机制图 :
只要你是个函数(不管你是个啥类), 永远都是内置Function这个类的一个实例
只要是函数, 都可以使用call apply bind 方法
- 实例
- 普通对象
- 普通Obj没区别, 就是对键值对的增删改查
function Fn() {
var n = 10;
this.m = 100;
}
Fn.prototype.aa = function () {
console.log("aa");
};
Fn.bb = function () {
console.log("bb");
};
// 普通函数
// Fn(); --> this指向window
// 有一个私有变量n, 和原型以及属性bb没有关系
// 构造函数执行
var f = new Fn; --> this指向f
console.log(f.n) --> 得到undefined n是私有变量和实例没有关系
console.log(f.m) --> 得到100, 实例的私有属性
f.aa(); --> 实例通过__proto__找到Fn.prototype上的方法
console.log(f.bb) --> 得到undefined , bb是把Fn当做一个普通对象设置的属性而已, 和实例等没有关系
// 普通对象
Fn.bb();
Number的两种角色
Array的两种角色
JQ这个类库中提供了很多的方法, 其中有一部分是写在原型上的, 有一部分是把它当做普通对象来设置的
function () {
function jQuery() {
return JQ实例
}
jQuery.prototype.animate = function () {}
jQuery.ajax = function () {}
window.jQuery = window.$ = jQuery;
}();
// $().ajax() 调不了
// $().animate() 这样可以调用
// $.ajax() 直接的对象键值对操作
// $.animate () 对象上面没有animate 这个属性, 这个属性在实例相关的原型上
三种关系之间没有必然关系