javaScript常见输出方式( 五 )


四、原型式继承
重点:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象 。.()就是这个原理 。
特点:类似于复制一个对象,用函数来包装 。
缺点:1、所有实例都会继承原型上的属性 。
2、无法实现复用 。(新实例属性都是后面添加的)
五、寄生式继承
重点:就是给原型式继承外面套了个壳子 。
优点:没有创建自定义类型,因为只是套了个壳子返回对象(这个),这个函数顺理成章就成了创建的新对象 。
缺点:没用到原型,无法复用 。
六、寄生组合式继承(常用)
寄生:在函数内返回对象然后调用
组合:1、函数的原型等于另一个实例 。2、在函数中用apply或者call引入另一个构造函数,可传参
重点:修复了组合继承的问题
继承这些知识点与其说是对象的继承,更像是函数的功能用法,如何用函数做到复用,组合,这些和使用继承的思考是一样的 。上述几个继承的方法都可以手动修复他们的缺点,但就是多了这个手动修复就变成了另一种继承模式 。
这些继承模式的学习重点是学它们的思想,不然你会在书本上的例子的时候,会觉得明明可以直接继承为什么还要搞这么麻烦 。就像原型式继承它用函数复制了内部对象的一个副本,这样不仅可以继承内部对象的属性,还能把函数(对象,来源内部对象的返回)随意调用,给它们添加属性,改个参数就可以改变原型对象,而这些新增的属性也不会相互影响 。
bind-call-apply
1.bind方法作用
? 修改函数或者方法中的this为指定的对象, 并且会返回一个修改之后的新函数给我们
? 注意点: bind方法除了可以修改this以外, 还可以传递参数, 只不过参数必须写在this对象的后面
? 2.call方法作用
? 修改函数或者方法中的this为指定的对象, 并且会立即调用修改之后的函数
? 注意点: call方法除了可以修改this以外, 还可以传递参数, 只不过参数必须写在this对象的后面
3.apply方法作用
? 修改函数或者方法中的this为指定的对象, 并且会立即调用修改之后的函数
? 注意点: apply方法除了可以修改this以外, 还可以传递参数, 只不过参数必须通过数组的方式传递
多态
多态是指事物的多种状态
多态在编程语言中的体现
? 父类型变量保存子类型对象, 父类型变量当前保存的对象不同, 产生的结果也不同
ES6类和对象
class Person{// 当我们通过new创建对象的时候, 系统会自动调用constructor// constructor我们称之为构造函数constructor(myName, myAge){this.name = myName;this.age = myAge;}// 实例属性// name = "lnj";// age = 34;// 实例方法say(){console.log(this.name, this.age);}// 静态属性(es6不支持这样写静态属性 只有外部添加)static num = 666;// 静态方法static run() {console.log("run");}}
注意点:
? 如果通过class定义类, 那么不能自定义这个类的原型对象
? 如果想将属性和方法保存到原型中, 只能动态给原型对象添加属性和方法
ES6继承
ES6之前的继承
? // 1.在子类中通过call/apply方法借助父类的构造函数
? // 2.将子类的原型对象设置为父类的实例对象
ES6开始的继承
class Person{constructor(myName, myAge){// this = stu;this.name = myName; // stu.name = myName;this.age = myAge; // stu.age = myAge;}say(){console.log(this.name, this.age);}}/*1.在ES6中如何继承1.1在子类后面添加extends并指定父类的名称1.2在子类的constructor构造函数中通过super方法借助父类的构造函数*/// 以下代码的含义: 告诉浏览器将来Student这个类需要继承于Person这个类class Student extends Person{constructor(myName, myAge, myScore){// 1.在子类中通过call/apply方法借助父类的构造函数// Person.call(this, myName, myAge);super(myName, myAge);this.score = myScore;}study(){console.log("day day up");}}let stu = new Student("zs", 18, 98);stu.say();