面向过程 --C 注重问题的解决
面向对象 --JAVA 完成对真实世界的模拟,把一个对象的共同特点抽离出现,有了所有的'属性'和'方法'
js并不是一个真正的面向对象的语言
js在模拟面向对象
js是一门基于面向对象的语言 --- 不是真正的面向对象
对象的特点:属性 + 方法
对象在js里面是由构造函数new出来的
面向对象
工厂模式
// 工厂模式
function dog(type , age) {
// 原材料
const obj = {} ;
// 加工
obj.type = type ;
obj.age = age ;
obj.say = function () {
console.log('有一只' + obj.age + '岁的' + obj.type);
}
// 出厂
return obj
}
const dog1 = dog('柯基' , 3) ;
// 缺点
// 创建出来的对象跟函数没有任何关系
// 创建的出来的对象之间的方法不共享
认识new
function fn() {
console.log(this);
console.log(666);
}
var res = fn() ; // this指向window
console.log(res); // 函数没有返回值 undefined
var res2 = new fn() ; // this指向了对象
console.log(res2); // 返回了这个对象
// new 做了什么
// 给函数添加了返回值 返回了一个对象
// 把this指向了这个对象
// 创建了一个对象
// function ff() {
// const obj = {} ;
// this -> obj ;
// return obj
// }
new的贡献:
1 创建了一个对象
2 this指向了这个对象
3 把这个对象的原型指向了构造函数的原型对象
4 返回了这个对象
js面向对象的发展过程
1 工厂模式 创建一个对象,给对象加工(添加属性和方法) , 返回这个对象
缺点:创建出来的对象和函数没有关系 ,方法也不共享
2 new (创建对象,把this指向了这个对象和返回对象都由new完成了)
解决的关系问题 , 方法依然不共享
3 prototype 原型对象:提供共享的属性和方法
js面向对象的模拟最终版
自身拥有的属性和方法写在构造函数中
共有的属性和方法写在构造函数的原型对象上
如何封装构造函数
普通的实现
把普通代码中的变量变成属性
把普通代码的代码块变成方法
注意:this的改变
提供公用的属性和方法
原型:
任何一个对象都有原型 __proto__ , 也就是这个构造函数
每一个对象都有__proto__属性 -> 指向对应的构造函数的原型对象
原型对象:
任何一个函数都有原型对象 prototype
给所有的实例化对象提供共有的属性和方法
原型链:
每一个对象都有原型,也就是__proto__这个属性,这个属性会指向这个构造函数函数的原型对象,也就是prototype,
构造函数的原型对象也是对象,也有原型,他指向对象也就是Object的原型对象
最终Object的原型对象也是对象,它的原型最终指向null
prototype:
每一个函数都拥有一个属性 prototype
给构造函数提供共有的属性和方法
hasOwnProperty:
hasOwnProperty() -- 用于判断属性或者方法是不是自己的(还有可能是继承来的)
typeof 判断数据类型 -- 可以准确的判断基本数据类型(只能知道是引用数据类型)
number / string / boolean / undefined / object / function
无法判断数组
Array.isArray() // 布尔值
constructor // 可以判断数组
instanceOf 用于判断一个对象是否是一个构造函数的实例化对象
es6 提供了class
class {
constructor() {
// 自身的属性和方法
}
// 共有的方法
}
class Dog {
constructor(type , age) {
this.type = type ;
this.age = age ;
}
say() {
console.log('汪');
}
speak() {
console.log(666);
}
}