面对对象程序设计,一开始不是那么好理解,尝试拟人化的方式方便理解记忆(忽略代码中用汉字)
首先可以将对象理解成一个人
字面量方法我们创建一个对象,ta有一些基本属性名字,性别,还能有有一些行为,比如思考,跑步,吃饭, 编程等等
var 某人 = {
name: '赵钱孙李',
sex: '未知',
eatSomeThing: function () {},
thinking: function () {}
}想吃饭,思考这些就是对象的方法
上面方式创建对象虽然快捷,但是无法复用,ECMA-262定义对象类似类的功能,可重复创建拥有相同属性和方法
下面说几个创建对象的模式
第一创建对象的模式,工厂模式,顾名思义”工厂“ 出来就一个完整的”人“,这个人知道祖先是非洲走出来的,但是不知道自己是亚洲人还是美洲人
instanceof:相当于基因检测,工厂模式只能检测出自己祖先来自非洲,不知道自己来之那块
用第二种模式我们就知道这个人是从哪来的,构造函数模式(构造函数是创建对象的基础)
function 亚洲(name, sex, address) {
this.name = name,
this.sex = sex,
this.address = address,
this.run = function () { console.log('run') }
}
// this 最终指向实例化对象
var 某人 = new 亚洲('周吴郑王','未知')
这种方式,instanceof 为true 检测出出资亚洲这个构造函数
这种方式挺好,但是身为人我们都有意共同特征就是会跑,如果卸载构造函数内,每次都要调用,所以我们要用到另一种模式,原型模式
想这样都会的技能统一用另一种方式来存放,大家共有的特征,行为都可以放到原型里,原型可以共享这些属性和方法
function Person() {}
Person.prototype.run = function () { console.log('run') }
Person.prototype.name = ''
Person.prototype.langage = ['汉语','英语']
var p1 = new Person()p1.langage.push('火星语')使用原型模式可以共享共有的属性和方法
但是原型有个问题,原型都默认值,这个人不能一出生就叫"赵钱孙李",不过不喜欢可以改,还有一个不能改,对于引用类型,所以我没学火星语,可是莫名多了火星语,我很惶恐
对于这种问题,接下来我们使用构造函数和原型组合模式来解决
function Person (name, age, langage) {
this.langage = langage
}
Person.prototype.run = function () { console.log('run') }
var 某人 = new Person('冯陈褚卫', 20, ['汉语','英语'])这样单独引用类型就通过传参控制~