js高级之原型特点

171 阅读3分钟

一.面向对象特征

1.面向对象三大特征

面向对象三大特征:封装、继承、多态

(1)封装:把代码放入对象的方法中

(2)继承:一个对象拥有另一个对象所有的成员

(2)多态:一个对象在不同情况下的不同状态

  • js语言基本不涉及多态

2.原型继承

2.1 继承:一个对象(子对象)拥有另一个对象(父对象)所有的成员

2.2 原型继承:把父对象作为子对象构造函数的原型

 //父对象
    let father = {
        house: {
            address: '深圳湾一号',
            price: 20000000
        },
        car: {
            brand: '劳斯莱斯幻影',
            price: 15000000
        }
    }

    //子对象
    //构造函数
    function Son(name, age) {
        this.name = name
        this.age = age
    }
    //原型继承: 把父对象 作为子对象构造函数的原型
    Son.prototype = father
    //可选 : 原型继承之后,由于父对象覆盖原来的 子对象构造函数原型, 就会导致constructor消失.
    //解决办法: 手动添加。(对开发几乎没有影响,也可以不加)
    Son.prototype.constructor = Son


    //实例对象
    let s1 = new Son('ikun', 30)
    let s2 = new Son('班长', 20)
    console.log(s1, s2)

二.原型链

1.原型链

1.1原型链:每一个对象都有自己的原型,而原型也是对象,也会有自己的原型,以此类推形成链式结构.称之为原型链.(原型链的终点是null)

1.2 对象访问原型链规则:就近原则

对象先访问自己的,自己没有就找原型的,原型没有就找原型的原型,一直到原型链终点null,如果还找不到.属性则获取undefined,方法则会报错 xxx is not function

1.3 原型链的作用(面试题): 继承

2.instanceof运算符

2.1 instanceof(关键字): 运算符。 用于检测 构造函数的prototype在不在实例对象的原型链中

说人话: 亲子鉴定,鉴定两个对象之间有没有血缘关系

2.2 语法: 实例对象 instanceof 构造函数

(面试题) instanceof运算符原理 : 检测 右边构造函数的prototype 在不在 左边实例对象的原型链中 true :在 false :不在

2.3 应用 : 某些函数为了限制你的数据类型,在内部需要用instanceof进行判断是否是正确的数据类型

三.函数补充(了解即可)

1.argumens关键字

1.1 arguments关键字: 获取函数所有的 实参

是一个伪数组 : 有数组三要素(元素、下标、长度),但是不能使用数组的方法

1.2 应用 : 一般用户参数数量不限的函数.

例如: arr.push() Math.max() 这些函数实参数量不限,底层原理就是使用arguments来接收所有的实参

2.剩余参数rest

2.1 剩余参数(rest参数) : 获取函数剩余的所有实参

    语法:  function 函数名(...形参名){}
        
        function 函数名(形参1,...形参2){}
        特点: (1)只能作为最后一个参数  (2)是真数组

2.2 一般情况下,rest参数可以取代arguments

3.函数默认参数

函数默认参数

function 函数名(形参=默认值){ }

 function fn(a = 10, b = 20) {
        //以前: 逻辑或短路
        // 找真 : 左边是真就返回左边式子的值,否则返回右边式子的值
        // a = a || 10
        // b = b || 20
        console.log(a + b)
    }