• 原型链图解帮助理解


    每个函数都有一个 prototype 属性,它默认指向一个 Object 空对象(即:原型对象

            * 函数的prototype属性:在定义函数时自动添加的,默认值是一个空object对象

            * 对象的_ proto__属性:创建对象时自动添加的, 默认值为构造函数的prototype属性值

            * 程序员能直接操作显式原型,但不能直接操作隐式原型(ES6之前)

    1. <script>
    2. // 每个函数都有一个 prototype 属性,它默认指向一个 Object 空对象(即:原型对象)
    3. function fun(){ }
    4. console.log(fun.prototype);
    5. // 向原型对象中添加属性或者方法 ===> 实例对象可以访问
    6. fun.prototype.test = function(){
    7. console.log('我是原型上添加的方法test(),实例可以调用');
    8. }
    9. console.log(fun.prototype);
    10. // 原型对象中有一个属性constructor,它指向函数对象
    11. console.log(fun.prototype.constructor===fun);
    12. // 创建一个实例,并调用上面给原型添加的方法 test
    13. var fun1 = new fun()
    14. fun1.test()
    15. </script>

    1、 函数的显示原型指向默认是空 Object 实例对象(但 Object 不满足)

    1. function Fn() {
    2. this.test1 = function(){
    3. console.log('test1()');
    4. }
    5. }
    6. Fn.prototype.test2 = function(){
    7. console.log('test2()');
    8. }
    9. var fn = new Fn()
    10. console.log(Fn.prototype instanceof Object); // true
    11. console.log(Object.prototype instanceof Object); // false

    2、 所有函数都是 Function 的实例(包括 Function 本身)

    1. console.log(Fn instanceof Function); // true
    2. console.log(Function.__proto__ ===Function.prototype);

    3、Object 的原型对象是原型链的尽头

    console.log(Object.prototype.__proto__); // null

    4、属性一般放在对象,方法一般放在原型上,实例对象的隐式原型等于构造函数的显示原型(Person.prototype)

    1. <script>
    2. function Person(name,age){
    3. this.name = name
    4. this.age = age
    5. }
    6. Person.prototype.setName = function(name){
    7. this.name = name
    8. }
    9. var p1 = new Person('Tom','12')
    10. console.log(p1);
    11. p1.setName('Bob')
    12. console.log(p1);
    13. var p2 = new Person('rose','14')
    14. p2.setName('romatic')
    15. // 实例对象的隐式原型等于构造函数的显示原型(Person.prototype
    16. console.log(p1.__proto__ === p2.__proto__); // true
    17. </script>

    测试题:

    1. <script>
    2. function Fn(){}
    3. Fn.prototype.a = 1
    4. var fn1 = new Fn()
    5. Fn.prototype = {
    6. a:2,b:3
    7. }
    8. var fn2 = new Fn()
    9. console.log(fn1.a,fn1.b,fn2.a,fn2.b); // 1 undefined 2 3
    10. </script>
    11. <script>
    12. function F(){}
    13. Object.prototype.a = function(){
    14. console.log('a()');
    15. }
    16. Function.prototype.b = function(){
    17. console.log('b()');
    18. }
    19. var f = new F()
    20. f.a() // a()
    21. F.a() // a()
    22. F.b() // b()
    23. f.b() // f.b is not a function
    24. </script>

  • 相关阅读:
    面试题--基础篇
    FFmpeg入门详解之6:VLC播放器简介
    面试总结大全
    输出菱形的代码
    刷题记录:牛客NC51180Accumulation Degree
    深度学习之基于YoloV5的火灾检测系统
    区块链技术与应用学习笔记(5-7节)——北大肖臻课程
    【牛客网面试必刷TOP101】二分查找/排序
    渲染噪点多怎么解决?渲染噪点多的原因及处理方法
    Linux操作系统:性能指标监控与通知
  • 原文地址:https://blog.csdn.net/Drizzlejj/article/details/126859107