拟人化理解对象....

172 阅读2分钟
面对对象程序设计,一开始不是那么好理解,尝试拟人化的方式方便理解记忆(忽略代码中用汉字)

首先可以将对象理解成一个人

字面量方法我们创建一个对象,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, ['汉语','英语'])

这样单独引用类型就通过传参控制~