• 原型链图解帮助理解


    每个函数都有一个 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>

  • 相关阅读:
    SpringBoot使用的时间与空间计量单位
    大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案
    华为防火墙 配置 SSLVPN
    甘特图组件DHTMLX Gantt用例 - 如何拆分任务和里程碑项目路线图
    xctf攻防世界 Web高手进阶区 upload1
    1.6、计算机网络的性能指标(2)
    限流器设计思路(浅入门)
    十分钟速成DevOps实践
    后端工程化 | SpringBoot 知识点
    17K薪资要什么水平?来看看95后测试工程师的面试全过程…
  • 原文地址:https://blog.csdn.net/Drizzlejj/article/details/126859107