携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
原型
原型 构造函数的 prototype 指向原型(所有的函数都有 prototype 属性,但实例没有);原型对象中有 constructor,指向构造函数;构造函数的实例的 proto 指向原型(所有的引用类型,都有 porto 属性)
原型链的基本原理: 任何一个 实例,通过原型链,找到它上面的原型,该原型对象中的方法和属性,可以被所有的原型实例共享(Object 是原型链的顶端,原型可以起到继承的作用,原型里的方法都可以被不同的实例共享) 访问一个实例,如果实例本身没有找到此方法或属性,就往原型上查找。如果还是找不到,继续向上一级的原型上找
每个实例对象(Object)都有一个私有属性 _ proto _ ,指向它构造函数的原型对象 __prototype__ 该原型对象也有自己的原型对象 __ __proto__ __ 层层向上,直到一个对象的原型对象为 null。null没有原型,并作为这个 __原型链__ 的最后一个环节
原型继承: 类似面向对象中的继承,“即时子类的对象,也是父类的对象”。 父类直接添加的方法和父类通过原型添加的方法都可以被子类正常访问
缺点: 无法实现多继承 父类的构造函数无法重复使用 来自父类的引用属性被所有子类共享 __继承__ :通过构造函数、通过原型链实现继承、构造函数 + 原型链 实现继承
当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象
数组都继承于__Array.prototype__ 包含 indexOf、forEach等方法;函数都继承于__Function.prototype__包含 call、bind 等方法
__Object.create()__方法可以创建一个新对象,新对象的原型就是传入的第一个参数
__prototype__是用于类的,__Object.getPrototypeOf()__是用于实例的,二者功能一致
改变原型的时候需要改变 constructor User.prototype = { constructor: User}
Object.setPrototypeOf(a, b) 为现有对象设置原型,返回一个新对象;接收两个参数,第一个是现有对象,第二个是原型对象 语法: Object.setPrototypeOf(obj, prototype) Object.getPrototypeOf(obj) 返回指定对象的原型
isPrototypeOf() 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上 语法:prototypeobj.isPrototypeOf(object)
hasOwnProperty() 返回一个布尔值,指示对象自身属性中是否具有指定的属性 语法: obj.hasOwnProperty(prop) 即使属性值是null或者undefined,只要属性存在,hasOwnProperty依旧会返回 true
this和原型没有关系,不要滥用原型
使用setPrototypeOf()代替 proto 原型的继承,不改变构造函数的原型