487 函数的三种角色:普通函数,构造函数(类),普通对象,原型链清明上河图

滴滴考察原型、原型链面试题

Function.prototype.a = () => {
    console.log(1)
}
Object.prototype.b = () => {
    console.log(2)
}
function A () {}
const a = new A()
a.a() // 报错
a.b() // 2
A.a() // 1

一、函数的三种角色

* 函数数据类型:

* 1. 普通函数

* 2. 类(内置类 OR 自定义类)

* 对象数据类型:

* 1. {}普通对象 []数组对象 /^$/正则对象 日期对象 Math数学函数对象 arguments等类数组对象 HTMLCollection/NodeList元素或者节点集合类数组对象...

* 2. 实例也是对象数据类型的

* 3. 类的prototype也是对象数据类型的(Function.prototype除外,它是一个匿名空函数)

* 4. 函数也是对象

*

* ======================================

*

* 函数有三种角色

* 1. 普通函数

* + 形参、实参、ARGUMENTS、RETURN、箭头函数

* + 私有作用域(栈内存、执行上下文)

* + 形参赋值 & 变量提升

* + 作用域链

* + 栈内存的释放和不释放(闭包)

* + ...

*

* 2. 构造函数(类)

* + 类和实例

* + prototype 和 __proto__ 原型和原型链

* + instanceof

* + constructor

* + hasOwnProperty

* + ...

*

* 3. 普通对象

* + 它是由键值对组成的

* + ...

* 函数中的THIS也是重要的内容

    function Fn(n, m) {
        this.x = n + m;
        this.y = n - m;
        let total = n * m;
        return total;
    }

    Fn.prototype.say = function () {
        console.log('SAY');
    }

    // => 普通函数
    let total = Fn(20, 10);
    console.log(total) // 200

    // => 构造函数(类和实例)
    let f = new Fn(20, 10);
    console.log(f) // Fn {x: 30, y: 10}

    // => 普通对象
    Fn.total = 1000;
    console.log(Fn.total) // 1000

原文地址:https://www.cnblogs.com/jianjie/p/13201524.html