- 面向过程 C语言 注重解决问题
- 面向对象 JAVA 完成对真实世界的模拟,把一个对象的共同特点抽离出现
- 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在执行函数时做了什么
- 给函数添加返回值,返回一个对象
- 把函数的this指向了返回的对象
- 创建了一个对象
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);
- 任何一个函数都是潜力股,都有可能成为一个构造函数,成为对象之母
- 函数成为构造函数最重要的是获得new的支持
- 为了区分普通函数和构造函数,构造函数的命名建议使用大驼峰
- 构造函数中的属性和方法只能通过,构造函数的实例化对象来访问
原型(难点)
什么是构造函数原型?
- 构造函数原型是构造函数的属性,本质是一个对象,这个对象的作用就是共享方法和属性,英文单词:
prototype; - 同一构造函数的实例化对象,都可以共享使用该构造函数prototype下的属性和方法
什么是对象原型?
对象原型是实例化对象的属性,本质也是一个对象,这个对象的作用是指向父级构造函数的prototype;英文单词:__proto__