什么是面向对象
在不了解原理的情况下,会使用功能
对象:黑盒子,不了解内部的结构,知道表面的各种操作(按钮)
面向对象是一种通用思想,并非只有变成中能用,任何事情都可以使用。比如:公司老总只需要告诉公司负责人需要做什么,不去关注其怎么实现的。
JS中的面向对象(OOP)
三大特性:
- 抽象:抓住核心(把和问题相关的一类特性抓出来)
- 封装:不考虑内部实现,用好表面的功能
-
继承:(遗传)从父类上继承出一些方法、属性,子类可以重用,也可以有新的一些特性。
继承有多重继承和多肽
对象的组成:
- 方法:属于一个对象的
function aaa () { // 函数:自由的
alert('aaa')
}
var arr = [1, 4, 5, 3]
arr.aaa = function () { // 方法:属于一个对象的
alert('afg')
}
- 属性:属于一个对象的(有主的)
var a = 12 //变量:自由的,不属于任何人
alert(a)
var arr = [1, 4, 5, 3]
arr.a = 12 // 属性,属于一个对象的
alert(arr.a)
this
:当前发生事件的对象。更准确的说:当前方法属于谁,this
就是谁
不能在系统对象中随意附加方法、属性,否则会覆盖已有方法、属性:不要给arr等添加方法。
Object
构造函数
缺点:
- 没有new
- 函数重复 --- 资源浪费
解决:
- 不需要
var obj = new Object
,直接使用this
,此时的this
是一个新的对象,不需要在return
,因为程序有偷偷地return this
function createPerson (name, age) {
this.name = name
this.age = age
this.showName = function () {
alert('我叫' + this.name)
}
this.showAge = function () {
alert('我叫' + this.age)
}
}
var person1 = new createPerson('luuz', 18) // 解决没有new的问题
- 原型(prototype):类的原型上添加东西
帮助理解:
css - class:一次给一组元素加样式。在js就叫做原型
var arr1 = new Array(12, 35, 43, 3)
var arr2 = new Array(4, 7, 43, 6)
Array.prototype.sum = function () { // 类似class
var result = 0
for (var i = 0; i < this.length; i++) {
result += this[i]
}
return result
}
alert(arr1.sum())
alert(arr2.sum())
css - 行间样式: 一次给一个元素加样式。在js叫做给对象加东西
var arr1 = new Array(12, 35, 43, 3)
var arr2 = new Array(4, 7, 43, 6)
arr1.sum = function () { // 只给arr1添加事件,对比行间样式
var result = 0
for (var i = 0; i < this.length; i ++){
result += this.[i]
}
return result;
}
alert(arr1.sum())
alert(arr2.sum()) // 报错
类和对象:
var arr = new Array()
类: 模子 Array
对象: 产品(成品) arr
原型用到面向对象里边?(混合方式)
function CreatePerson (name, age) {
this.name = name
this.age = age
}
CreatePerson.prototype.showName = function () {
alert('我叫' + this.name)
}
CreatePerson.prototype.showAge = function () {
alert('今年' + this.age)
}
var person1 = new CreatePerson('luuz', 23)
var person2 = new CreatePerson('luuuuu', 18)
alert(person1.showName == person2.showName) // true (都是来源于原型上)
构造函数加属性(不一样的东西),原型上加事件(一样的东西)
类的命名规范:大驼峰(首字母大写)