• 原型链图解帮助理解


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

  • 相关阅读:
    Spring 使用 Mypy 检查 30 万行代码,总结出三大痛点与六个技巧
    运行原理:eBPF 是一个新的虚拟机吗?
    【超详细】MYSQL 8.0 数据库安装与配置教程
    [PAT练级笔记] 21 Basic Level 1021 个位数统计
    IB DP 语言怎么选?
    Elasticsearch的增删改查基本操作
    电脑提示msvcp140.dll丢失的解决方法(附带详细msvcp140.dll文件分析)
    Xcode13 “消失”的Info.plist文件
    javaweb汽车租赁系统
    【规则】Adblock Plus 广告过滤规则自用整理
  • 原文地址:https://blog.csdn.net/Drizzlejj/article/details/126859107