《Javascript高级程序设计》面向对象程序设计学习笔记

一、创建对象的三种模式

1、工厂模式。定义函数,显式创建Object对象并返回。

2、构造函数模式。定义构造函数,首字母大写,不显式声明与返回对象。调用时只要new createFunction(args), 就可以创建对象。缺点是每个成员方法都要在每个实例上重新创建一遍。

3、原型模式。每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。这个对象是函数的原型对象,用途是包含可以用由特定类型的所有实例共享的属性和方法。示例如下:



或者:


二、原型对象

1、构造函数、构造函数的原型对象与实例

所有原型对象都会自动获得一个constructor属性,这个属性包含一个指向prototype属性所在函数(构造函数)的指针。当用构造函数创建新实例后,实例内部包含一个指针__proto__,指向构造函数的原型对象。构造函数、构造函数的原型对象、通过构造函数创建的实例之间的关系如下:



访问某个对象的某个属性时,从对象实例本身开始搜索。如果在实例中找到了具有给定名字的属性,则返回该属性的值,如果没找到,继续搜索实例的原型对象。因此,如果修改了原型对象,则变化会反映在所有实例中。

当为对象添加一个属性后,如果该属性与原型对象中某属性相同,则访问时会屏蔽原型对象中的同名属性,但无法修改原型对象中的属性

在使用对象字面量方式重写原型对象时(上述第二段代码),constructor属性如果不显示指向Person函数,则会指向Object构造函数,而不会像默认那样指向Person函数。所以如果constructor的值很重要,则需添加constructor: Person,这样的声明。


2、原型的动态性

通过构造函数构建的实例,指向原型对象,而非构造函数中的prototype指针。所以以下这段代码会报错:



prototype修改前与修改后,关系链变化如下:



然而也是由于原型模式的共享性,不仅仅是方法,成员变量也会共享。这带来很多不便。因而原型模式不会单独使用。一般是组合使用构造函数模式与原型模式,构造函数模式定义实例属性。

三、继承

1、原型链

如果我们让原型对象等于另一个类型的实例,则 此时的原型对象将包含一个指向另一个原型的指针(__proto__),相应的,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,形成了实例与原型的链条,纪实原型链。

实现原型链的基本模式:



上述代码原型链图解如下:




所有引用类型默认都继承了Object对象。

由于原型中可能包含引用类型值,而该值会被所有实例及子类型继承,这可能会带来一些不便。所以很少单独使用原型链。

2、借用构造函数

在子类型的构造函数中调用超类型的构造函数。


this值是在动态执行中确定的。所以未来将要新创建的subType实例,每一个都会有自己的colors属性。

但是如果单使用构造函数的话,函数复用就无从谈起,每一个实例都将拥有自己的函数对象。

3、组合继承

使用原型链对原型属性及方法进行继承,使用构造函数方法来实现实例属性的继承。这样既可以实现方法复用,又可以使每个实例拥有自己的属性。实现代码如下:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值