一、面向对象:不注重过程,注重这件事有几个对象在参与
三大特性:1、封装性,2、继承性,3、多态性
二、对象的创建
var obj = {}
var pbj = new Object()
三、工厂函数
创建多个对象之后,如果发现多个对象的结构是一致的,多个对象的创建代码就是重复的 - 使用循环没办法处理,只能使用函数来进行处理
工厂函数 - 批量制造对象的工厂(工厂知道对象的时候,会比使用字面量方式创建对象更好)
function createObj(name,age,sex) { var obj2 = { name, age. sex } return obj2; } var obj = createObj('张三',12,'男') var obj1 = createObj('李四',13,'女') var obj2 = createObj('王五',15,'男')
四、构造函数
1、概念:任何函数都可以通过new来创建对象 - 函数是js中一等公民
当一个函数be被new来创建对象使用的时候 - 这个函数就被叫做构造函数了
2、特性
(1)构造函数的首字母都是大写的
(2)构造函数在被new的时候是可以传参数的 - 但如果不传参数的时候,new的时候构造函数的后面就可以省略小括号
3、new关键字
(1)悄悄的在构造函数中创建一个空对象
(2)悄悄的讲这个空对象赋值给this
(3)执行函数中的代码
(4)悄悄的讲这个空对象return出去
五、原型
任何对象天生自带属性 __proto__ ,值是一个对象,对象就是原型/原型对象
原型上的属性和方法默认能被对象使用 - 原型(父) 对象(子)
任何构造函数天生自带属性prototype 值也是原型
通过原型解决问题:
面向对象:
创建对象:使用自定义构造函数
添加属性:在构造函数中添加
添加方法:将方法添加在构造函数的原型上
function Person(name,age,sex){ this.name = name; this.age = age; this.sex = sex; } // 通过构造函数给原型添加方法 Person.prototype.eat = function(){ console.log("能吃"); } var p1 = new Person('张三',12,'男') var p2 = new Person('李四',13,'女') // p1的原型和p2的原型是不是同一个 // console.log( p1.__proto__ === p2.__proto__ ); p1.eat() p2.eat() console.log( p1.eat === p2.eat );
挡在访问一个对象的属性时,先在当前对象上找是否有这个属性,如果有,就找到了,如果没有就去对象的原型上找,在对象的原型上找到了,就使用,如果对象的原型上没有找到,到对象的原型的原型上找......直到Object对应的原型上,都没有找到的话,就返回undefined