一、函数的三种形态:
- 1.作为一个普通函数执行(形参 实参 arguments 返回值)
- 2.函数作为一个类(new Fn,构造函数执行)
- 3.函数也是一个对象(内置Function的实例化对象)
- 可以添加属性 自身也有私有属性
- 和普通的一个obj没区别,就是对键值对的增删改查
- 三种角色之间没有必然的联系
function Fn(){
var n = 10;
this.m = 100;
};
Fn.prototype.aa = function (){
console.log('aa');
};
Fn.bb = function(){
console.log('bb');
};
Fn();
var f = new Fn;
console.log(f.n);
console.log(f.m);
f.aa();
console.log(f.bb);
Fn.bb;
复制代码
二、三种角色详解
1.普通函数
function fe(a, b) {
console.log('fe', a, b)
return a + b
};
console.log(fe(1, 2));
复制代码
- 形成一个私有作用域
- 形参赋值 变量提升
- 函数体代码从上到下执行
- 如果有return 返回值
2.作为类 (函数)
- (1) 类.prototype 可以在类的原型上 保存一些公有的属性和方法
- (2) new 操作符 可以让类 生成一个实例对象(
__proto__
), 同时也可以给这个实例对象添加一些私有属性和方法
function Fn(n) {
var num = 123
this.xxx = 100
}
const f = new Fn(1)
console.log(f)
复制代码
3.作为一个普通对象 (所有对象数据类型都是Object的一个实例)
function fe(a, b) { }
console.log(fe.length)
console.log(fe.name)
console.log(fe instanceof Object)
fe.age = 10
fe.title = 'hello'
复制代码
三、相关执行题:
题目一:
function Foo() {
getName = function () {
console.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);
};
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
复制代码