-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
16、ES5 继承 #16
Comments
这个也记不清楚了,晚上回去瞅瞅高程三再回头总结下。 其实 JS 是没有继承的,所谓的继承也是根据原型进行模拟继承的。实现的继承,主要就是实现以下特性:
通用的一种就是 把实例属性与方法与原型上的属性与方法分开。在子类构造函数中调用父类,并将子类的原型指向父类。
关机下班 |
aaaaaaaaaaaaaaaaa,中午午休时间,办公室的阿姨们好吵啊,睡不着。 |
原型:突然间就想到刚学 js 的时候,我很好奇为啥数组对象会有那么多方法可以调用,我明明没创建他们啊,当时太菜也没多想,又不是不能用,当时心里就觉得可能这就是因为所以科学道理人家规定的吧需要死记硬背api的。后来实习时随着api搬运的越来越熟练,我就有了更多的空闲时间,刚开始打游戏,后来游戏打烦了太无聊了就去看了高程三。然后才大概知其所以然了。_每一个JavaScript对象在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。_而这些能用的方法其实就是从原型继承而来的。 每个 js 对象都有 一个 __proto__ 属性,这个属性指向了原型,该属性是浏览器内部实现的。其实原型也是一个对象,展开 __proto__ 会发现里面有很多方法。 展开后看到有个 constructor 属性,也就是构造函数。
构造函数、实例原型与原型
实例与原型
比如基于原型链的继承中,实例中没有某个方法却可以调用,就是向上查找在原型上找到了。 原型的原型Object.prototype 的原型
引用阮一峰老师的 《undefined与null的区别》 就是: null 表示“没有对象”,即该处不应该有值。 所以 Object.prototype.__proto__ 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。 所以查找属性的时候查到 Object.prototype 就可以停止查找了。 |
下面是继承方面 |
1. 原型链继承用法: 重写原型对象,通过将子类的原型指向父类的实例。
a 的原型 a.__proto__ 默认指向 Man.prototype ,而把 new People() 赋值给 Man.prototype 的是就相当于 把 a 的原型指向了 new People(),那么 new People() 的原型 new People().__proto__ 上的方法属性 a 都可以通过原型链进行访问到,即为父类 People.prototype 上的方法属性 a 都可以通过原型链访问到。 这个时候当我们访问 a 实例的属性或方法时会经历一下三个阶段:
缺点:
|
2. 借用构造函数基本思想:在子类型构造函数的内部调用父类构造函数为了解决原型中包含引用类型值所带来的的问题。。通过 People.call(this, name) 这样子类中继承到的每一份父类的属性方法都是新的。同时可以在子类型构造函数中向父类构造函数传递参数。
缺点:方法都在构造函数中定 义,因此函数复用就无从谈起了。而且,在超类型的原型中定义的方法,对子类型而言也是不可见的,结 果所有类型都只能使用构造函数模式。 |
3. 组合继承基本思想:使用原型链结合构造函数。原型链实现对原型属性与方法的继承,构造函数实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数 复用,又能够保证每个实例都有它自己的属性。这是实践中常用的继承方式。不过这里有一点瑕疵:一个子类实例将会持有两份父类实例的数据。因为使用了原型链。
|
4.原型式继承基本思想: 创建一个继承了父类的空子类实例,就是创建一空对象,把他挂载到另一个对象的原型链上。
其实该函数就是Object.create()的实现
Object.create()方法的第二个参数与 Object.defineProperties()方法的第二个参数格式相同: 每个属性都是通过自己的描述符定义的。以这种方式指定的任何属性都会覆盖原型对象上的同名属性。
提醒:包含引用类型值的属性始终都会共享相应的值 |
5. 寄生式继承基本思想:在原型式继承 createObject 的基础上包裹一层,生成了子类实例后再添加一些属性方法返回
|
6. 寄生组合式继承基本思想: 在组合继承的基础上,子类继承一个由父类原型生成的空对象。先看下组合继承的一个例子:
组合继承缺点在于继承父类函数时调用了构造函数,我们只需要优化掉这点就行了。对此可以将父类的原型赋值给了子类,并且将构造函数设置为子类,这样既解决了无用的父类属性问题,还能正确的找到子类的构造函数。
|
混入式继承来自 掘金 迪斯马斯克
实际上,考虑到父类的实例和父类的原型对象都是对象,所以在为子类实例添加父类实例的属性的时候,也可以直接使用混入。上面的代码可以修改为:
|
No description provided.
The text was updated successfully, but these errors were encountered: