函数三种角色剖析
函数的三种角色:
- 函数: 函数本身是一个堆内存,内部存储的是一堆没有意义的代码字符串(上下文,作用域相关知识和概念)。
- 类(构造函数):函数也可以被当作类操作,用new来执行(类、实例、原型、原型链相关概念)。
- 对象:函数还是一个对象,包含键值对,有prototype(原型),还有name(函数名)、length(形参个数)和__proto__(原型链)等属性。
先看一道题
function Fn(){
this.x=100;
}
Fn.prototype.getX = function(){
console.log(this.x);
}
let f1 = new Fn;
let f2 = new Fn;
答案分析图
- 函数的三种角色本身没有必然联系。
- 所有的函数(普通函数/构造函数…)都是Function类的一个实例。
- Function.prototype值是一个匿名空函数,但是没有prototype。
- Function.prototype.__proto__指向Object.prototype(万物皆对象,每一个对象都是Object的实例)。
- Function.__proto__也是指向Function.prototype。
- Object是所有对象的基类,万物皆对象。
- Object.prototype.__proto__值是null(若存在应该指向自己,这样毫无意义)。
- 实例.__proto__指向当前所属类的实例([f1 / f2].__proto__ === Fn.peototype)。
练习题
function Foo(){
getName = function(){
onsole.log(1);
};
return this;
};
Foo.getName = function(){
console.log(2);
};Foo.prototype.getName = function(){
console.log(3);
};
var getName = function(){
console.log(4);
};
function getName(){
console.log(5);
};
答案解析