javascript面向对象

117 阅读3分钟
  1. 面向过程 C语言 注重解决问题
  2. 面向对象 JAVA 完成对真实世界的模拟,把一个对象的共同特点抽离出现
  3. js并非真正意义上的面向对象的语言,只是在模拟面向对象

问题一:描述一只狗

面向过程

const dog = '金毛';
const age = '2';

console.log('这是一只'+age+'岁的'+dog);

面向对象

const obj{
    dog : '金毛',
    age : 2
}
console.log('这是一只'+obj.age+'岁的'+obj.dog);

问题二:描述多只狗

面向过程

const dog = '金毛';
const age = '2';
const dog2 = '二哈';
const age2 = '1';
console.log('这是一只'+age+'岁的'+dog);
console.log('这是一只'+age2+'岁的'+dog2);

面向对象

const obj{
    dog : '金毛',
    age : 2
}
const obj2{
    dog : '二哈',
    age : 1
}
console.log('这是一只'+obj.age+'岁的'+obj.dog);
console.log('这是一只'+obj2.age+'岁的'+obj2.dog);

上面的方法及其繁琐,很反人类,因此js诞生了构造函数,我们来看一下早期的工厂模式,和现在的new函数

早期的工厂模式

函数中创建一个数组

function dog(type,age){
    const obj{
        obj.type = type;
        obj.age = age;
        obj.say = function(){
            console.log('汪汪汪');
        }
    }
    return obj;
}

const jinmao = dog('金毛',2);

工厂模式的缺点:创建出来的对象与函数没有任何关系,创建出来的对象之间的方法不共享,浪费内存

认识new (重要)

new在执行函数时做了什么

  1. 给函数添加返回值,返回一个对象
  2. 把函数的this指向了返回的对象
  3. 创建了一个对象
function fn(){
    console.log('666');
}

//当函数没有返回值时,函数的普通调用,赋值会等于undefinde
var res = fn();//666 res=undefinde
//使用new调用函数后,函数即使没有返回值,赋值时也会返回一个对象
var res2 = new fn(); // 666 res2 = fn{}

构造函数(重要)

function Dog(type,age){
    //const Dog = {};//由于new创建了一个对象因此不需要这一步
    this.type = type;//Dog.type = type//由于new把函数的this指向了返回的对象,所有这里的this就这个函数的对象
    this.age = age;//Dog.age = age
    //return Dog;//由于new给函数添加返回值,返回的就是一个对象,所以这一步也不需要
}

const jinmao = new Dog('金毛',2);
  1. 任何一个函数都是潜力股,都有可能成为一个构造函数,成为对象之母
  2. 函数成为构造函数最重要的是获得new的支持
  3. 为了区分普通函数和构造函数,构造函数的命名建议使用大驼峰
  4. 构造函数中的属性和方法只能通过,构造函数的实例化对象来访问

原型(难点)

什么是构造函数原型?

  1. 构造函数原型是构造函数的属性,本质是一个对象,这个对象的作用就是共享方法和属性,英文单词:prototype
  2. 同一构造函数的实例化对象,都可以共享使用该构造函数prototype下的属性和方法

什么是对象原型?

对象原型是实例化对象的属性,本质也是一个对象,这个对象的作用是指向父级构造函数的prototype;英文单词:__proto__

图说构造函数原型和对象原型

图片.png