美文网首页
前端知识点之原型链

前端知识点之原型链

作者: 无故下架内容so账号已弃用 | 来源:发表于2019-01-08 14:23 被阅读0次

    知识点:
    --什么是构造函数?
    --原型规则
    --原型链
    --instanceof

    上来先贴一段代码

    <script>
        function Foo (name,age) {
            this.name = name;
            this.age  = age;
        }
    
        Foo.prototype.showInfo = function (){
            console.log(this.name + ' ' + this.age);
        }
    
        var f = new Foo('张三', 23);
        f.eat = function (){
            console.log('正在吃...');
        }
    
        f.eat(); 
        // 正在吃...
        //调用了自身的 eat 方法
        console.log(f.hasOwnProperty('eat')); // true 判断 eat 是否是自身的属性/方法
        f.showInfo(); 
        // 张三 23
        // 调用了f.__proto__ (即 Foo.prototype) 的 showInfo 方法, f.__proto__ === Foo.prototype
        console.log(f.hasOwnProperty('showInfo')); // false 判断 showInfo 是否是自身的属性/方法
        console.log(f.toString()); 
        // [object Object]
        // 调用了 f.__proto__.__proto__ 即(Object) 的 toString 方法
    </script>
    

    1. 什么是构造函数?

    1、构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写
    2、构造函数和普通函数的区别在于:调用方式不一样
    3、普通函数的调用方式:直接调用 fn();
    4、构造函数的调用方式:需要使用new关键字来调用 new Fn();
    5、构造函数的执行流程
    A、立刻在堆内存中创建一个新的对象
    B、将新建的对象设置为函数中的this
    C、逐个执行函数中的代码
    D、将新建的对象作为返回值
    原文:https://blog.csdn.net/darcyxz/article/details/79370084

    例子中的 Foo 就是一个构造函数,而 f 就是 Foo 一个实例

    再看这些:

    • var a = {} 是var a = new Object() 的语法糖
    • var a = [] 是var a = new Array() 的语法糖
    • function Foo () {} 是 var Foo = new Function () 的语法糖

    也就是说,Object Array Function 就是构造函数,而 a 就是它们的一个实例

    2. 原型规则
    (1) 所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性,null 除外。

    var obj = {};
    obj.a = 100;
    
    var arr = [];
    arr.b = 100;
    
    var fn = function (){};
    fn.c = 100;
    
    var nObj = null;
    nObj.d = 100; // 报错
    

    (2) 所有的引用类型(数组、对象、函数),都有一个 __proto__ 属性,属性值是一个普通的对象。

    (3) 所有的函数,都有一个 prototype 属性,属性值也是一个普通的对象。

    约定 __proto__ 为隐式原型,prototype 为显式原型

    (4) 所有的引用类型(数组、对象、函数),__proto__ 属性值指向它的构造函数的 prototype 属性值,

    在代码例子中,有 f.__proto__ === Foo.prototype // true

    (5) 当试图得到一个对象的某个属性,如果这个对象本身没有这个属性,那么它就会去它的 __proto__ 即 它的构造函数的 prototype 属性值 中去寻找。

    这点对应代码例子中

    f.showInfo(); 
    // 张三 23
    // 调用了f.__proto__ (即 Foo.prototype) 的 showInfo 方法, f.__proto__ === Foo.prototype
    console.log(f.toString()); 
    // [object Object]
    // 调用了 f.__proto__.__proto__ 即(Object) 的 toString 方法
    

    注: 可以使用 hasOwnProperty() 方法来判断是否是自身的属性

    console.log(f.hasOwnProperty('eat')); // true 判断 eat 是否是自身的属性/方法
    console.log(f.hasOwnProperty('showInfo')); // false 判断 showInfo 是否是自身的属性/方法
    

    3. 原型链
    再贴一遍刚刚贴过的代码,方便看

    <script>
        function Foo (name,age) {
            this.name = name;
            this.age  = age;
        }
    
        Foo.prototype.showInfo = function (){
            console.log(this.name + ' ' + this.age);
        }
    
        var f = new Foo('张三', 23);
        f.eat = function (){
            console.log('正在吃...');
        }
    
        f.eat(); 
        // 正在吃...
        //调用了自身的 eat 方法
        console.log(f.hasOwnProperty('eat')); // true 判断 eat 是否是自身的属性/方法
        f.showInfo(); 
        // 张三 23
        // 调用了f.__proto__ (即 Foo.prototype) 的 showInfo 方法, f.__proto__ === Foo.prototype
        console.log(f.hasOwnProperty('showInfo')); // false 判断 showInfo 是否是自身的属性/方法
        console.log(f.toString()); 
        // [object Object]
        // 调用了 f.__proto__.__proto__ 即(Object) 的 toString 方法
    </script>
    
    image.png

    4. instanceof
    用于判断引用类型属于哪个构造函数的方法,

    instanceof 的判断逻辑:
    通过 __proto__ 一层一个层往上找,

    var obj = {};
    console.log(obj instanceof Object); // true
    
    var arr = [];
    console.log(arr instanceof Array); // true
    console.log(arr instanceof Object); // true
    
    var fn = function (){};
    console.log(fn instanceof Function); // true
    console.log(fn instanceof Object); // true
    

    以上为学习笔记,参考来源:慕课网的课程

    相关文章

      网友评论

          本文标题:前端知识点之原型链

          本文链接:https://www.haomeiwen.com/subject/nldjrqtx.html