• 彻底搞懂JS 原型链


    // JS 道德经  混沌是什么? 混沌是null, 混沌中产生道。
    // 道是什么? 道是Object.prototype 。它是最原始的对象。
    console.log('Object.prototype.__proto__ is:', Object.prototype.__proto__) // null
    // 先有Object.prototype ,它是{},
    console.log('Object.prototype is:', Object.prototype) // {}
    // 道生一,一是什么?一是 Function.prototype
    console.log(Function.prototype.__proto__ === Object.prototype) // true
    
    // 一生二,二是什么?二是:Function.和Object.
    console.log(Object.__proto__ === Function.prototype) // true, Object对象继承于Function,!函数是对象,对象不是函数的源头
    console.log(Object.__proto__ === Object.prototype)  // false
    console.log(Function.__proto__ === Function.prototype) // true, 这是最奇怪的地方,需要好好思考,Function继承自己。
    // 二生万物,也就是两派,object和function,从本质来说,万物归一,就是Function.prototype,也就是说都可以是函数
    // 即JS中函数是第一公民
    
    // 函数派
    var A = new Function('name', 'return ' + '`Hello ${name}!`')
    /**
      等价于 function A(name) {return `Hello ${name}!`}
    **/
    console.log(A.__proto__ === Function.prototype) // true
    console.log(A.prototype === Function.prototype) console.log(A.__proto__ === Object.prototype) // false var a = new A() console.log('A.prototype is:', A.prototype) // anonymous {} A继承于 Function console.log('A.prototype.constructor is:', A.prototype.constructor) // anonymous {} console.log(a.__proto__ === A.prototype) // true console.log('a.prototype is:', a.prototype) //undefined console.log(a instanceof Function) // false console.log(a instanceof A) // true var b = function B() {} /** 等价于 var b = new Function('', return) 等价于 var b = {} b.__proto__ = Function.prototype Function.call(b, '') **/ // 不存在B.prototype console.log('b.prototype is:', b.prototype) // {} 对象的prototype没有赋值, console.log(b.__proto__ === Function.prototype) // true console.log(b.__proto__ === Function.__proto__) // true console.log('b.prototype.constructor is:', b.prototype.constructor) // function B{}
    // 对象派 Object.create() 和 new Object() var options = { 'a':'A' } // options等价于 options = new Object(),options.a = 'A' var obj = Object.create(options) obj.b = 'B' console.log(obj.__proto__) // { a: 'A' } // 父类 console.log(obj.prototype) // undefined 没有定义 console.log(options.__proto__) // {} 回到了道 Object.prototype var obj = new Object() obj.b = 'B' console.log(obj.__proto__); // {} console.log(obj.prototype) // undefined, console.log({}.prototype) // undefined 等价, 这里与function不同 // 难点: Function.prototype 生 Object 和 Function的过程

     附图:

  • 相关阅读:
    2019左其盛好书榜,没见过更好的榜单(截至4月30日)
    3星|菲利普·科特勒《我的营销人生》:大师一生经历、成就、著作回顾
    3星|樊登《低风险创业》:创业相关的书+樊登个人创业经验
    OKR能解决996吗?德鲁克怎么看?
    《中国合伙人》背后的故事:4星|俞敏洪《我曾走在崩溃的边缘》
    3星|路江涌《共演战略画布》:PPT技巧级别的创新,缺实际分析案例
    C# 通用数据库配置界面,微软原生DLL重整合
    SoapUI、Jmeter、Postman三种接口测试工具的比较分析
    用VS制作的windows服务安装包 安装完后如何让服务自动启动
    POI使用详解
  • 原文地址:https://www.cnblogs.com/liuyinlei/p/14373786.html
Copyright © 2020-2023  润新知