原型和原型链的学习


面向对象底层运行机制

1.每一个函数(自定义类/内置类/普通对象)都具备一个属性:prototype【原型】,这个属性是一个对象,在这个对象中存储的是,当前类供应给实例调用的公共属性方法,

2.在prototype这个对象中,内置一个constructor属性,属性值是当前类本身

3.每一个对象(普通对象/数组对象../实例也是对象/prototype也是一个对象)都具备一个属性__proto__[原型链]属性值是当前对象(实例)所属类的prototype.

画图了解prototype和__proto__

原型链 练习1

答案画图解释1

原型链 练习2

答案画图解释2

原型链 练习3

答案画图解释3

函数的三种角色

1.普通函数

2 构造函数

3.普通对象

底层

Function作为一个函数是自己类的实例

基于内置类原型扩展方法

向内置类的原型上扩展方法,需要注意的点。

1.为了防止自己设定的方法覆盖内置的方法,我们设置的方法加前缀。

2:优势,用起来方便,和内置方法类似,直接让实例调用即可。

3.方法中的this一般是当前操作的实例。

4.优势:只要保证方法的返回结果是当前类的实例,那么我们可以基于“链式写法”调用当前类中提供的其他方法。(返回结果是谁的实例,就可以继续调用谁的方法)

在Array原型上添加一个数组去重的内置方法

利用es6的Set方法

通过对象来去重

代码

// 在Array原型上添加一个数组去重的内置方法
    // 利用es6的Set方法
    Array.prototype.myunique = function myunique() {
        // console.log(new Set(this)) 
        let newArr = Array.from(new Set(this))
        return newArr

    }

    // 通过对象来去重
    Array.prototype.myuniquea = function myuniquea() {
        let obj = {}
        for (let i = 0; i < this.length; i++) {
            obj.hasOwnProperty(this[i]) ? (this[i] = this[this.length - 1],this.length--,i--) : obj[this[i]] = this[i]
        }
        obj = null;
        return this

    }

    let arr = [1, 1, 2, 3, 2, 3, 3, 4, 5, 4, 4]
    console.log(arr.myunique())
    console.log(arr.myuniquea())

内置方法的缺点

for in遍历对象,所有可枚举的属性都可以被遍历到。所以处理 for in 循环的时候 ,我们需要加hasOwnProperty判断。