js面向对象
面向对象:
面向对象编程思想,把事物分解成一个个对象,然后由对象分工与合作,每一个函数,
一定会有一个原型,属性的选择性放在实例化的对象中,函数写在原型上。
面向对象,具有更好的灵活性,代码可服用,容易维护和开发。
具有封装性(低耦合,高内聚),继承性(子类继承父类中的一些属性和方法),多态性(重载)。
面向对象的思维特点:
抽取对象共用的属性和方法封装成一个类
对类进行实例化,获取类的对象,每实例化一次就产生一个新的对象
constructor属性
1.每个对象在创建时都会自动拥有一个构造函数属性constructor
2.constructor是通过继承关系继承下来的,当前实例的对象父类就是__proto__,
里面就有constructor属性,它继承了原型对象,constructor指向了当前的构造函数
3.constructor属性表示原型对象和构造函数之间的关联关系
class Name { constructor(uname) { // 方法体 this.uname = uname; } } var name = new Name('啊啊啊'); console.log(name.uname); // 输出:啊啊啊
原型对象 (prototype)
- 构造方法的问题:浪费内存的问题,复杂数据类型 (例如函数) 他会另外开辟一个内存空间存相同的数据
2.为了解决这个问题,每个构造函数都会有一个自带的对象 prototype,我们可以把那些不变的方法直接定
义在 prototype 上,所有的对象可以共享这些方法
function Star(uname, age) { // 变量 this.uname = uname; this.age = age; } // 原型对象里的方法 Star.prototype.sing = function() { console.log('我会唱歌'); }
call 函数
call 可以调用函数,call 改变函数的 this 指向 (第一个参数代表函数的 this 指向,后面的参数代表传递参数)
用 call 函数来调用父构造函数,但是需要把父构造函数里面的 this 都变为子构造函数的 this
function Father(uname, age) { // this 指向 Father this.uname = uname; this.age = age; } function Son(uname, age) { // 使 Son 继承 Father 的属性 Father.call(this, uname, age); }