shizhihuaxu / study-notes

学习笔记,见 issues
0 stars 0 forks source link

Function 和 Object 的关系 - 😵 #4

Open shizhihuaxu opened 4 years ago

shizhihuaxu commented 4 years ago

Function 和 Object的关系

js中面向对象编程是基于构造函数(constructor)和原型链(prototype)的;

  1. Function 是最顶层的构造器,Object 是最顶层的对象;

  2. Function 是最顶层的构造器,它构造了系统中所有的对象,包括用户自定义对象,系统内置对象,甚至包括它自已;所有的函数对象是被 Function 这个函数对象构造出来的,都是 Function 的实例;

    // 创建用户自定义对象
    function func() {}  // 函数声明
    let func = function () {} // 函数表达式
    let func = new Function()  // Function 构造器 
    
    func.constructor === Function
    
    // 系统内置对象
    Object.constructor // Function() { [native code] }
    Number.constructor
    String.constructor
    
    // Function 自身
    Function = new Function()
    
    Function.constructor === Function
    Function.__proto__ === Function.prototype // new 运算符发生的事情
  3. Object 是最顶层的对象,所有的对象都将继承 Object 的原型;Object 也是由 Function 构造出来的;

    let obj = {}
    obj.__proto__ === Object.prototype  // true
    
    var Foo= function(){} 
    Foo.prototype.__proto__ === Object.prototype // true
  4. Object对象直接继承自Function对象,一切对象(包括Function对象)直接继承或最终继承自Object对象。

    Function 创建了自己;

    Function 创建了Object;

    然后所有对象又继承 Object 的原型;

  5. 做个题试试

    var Foo= function(){}  
    
    var f1 = new Foo();  
    
    console.log(f1.__proto__ === Foo.prototype);  
    
    console.log(Foo.prototype.constructor === Foo);  
    
    var o1 =new Object();  
    
    console.log(o1.__proto__ === Object.prototype);  
    
    console.log(Object.prototype.constructor === Object);  
    
    console.log(Foo.prototype.__proto__ === Object.prototype);  
    
    //Function and Object  
    
    console.log(Function.__proto__ === Function.prototype);  
    
    console.log(Object.__proto__ === Function.prototype);  
    
    console.log(Object.prototype.__proto__);  
    
    console.log(Object.__proto__ === Function.prototype);