JavaScript第六章节 面对对象的程序设计
理解对象
属性类型
数据属性
- Configurable:表示能否通过delete删除属性从而定义属性
- Enumberable:表示是否能通过for-in循环返回属性
- Writeable:表示能否修改属性的值
- Value:包含这个属性的数据值
- 要修改属性的默认的特性,需要使用Object.defineProperty(),该方法接收三个参数:属性所在的对象,属性的名字和一个描述符对象,其中描述符对象的属性必须是:configurable,enumberable,writable和value,设置一个或多个值,即可修改
访问器属性
访问器属性有四个特征
- configurable
- enumberable
- get:在读取属性时调用的函数,默认为undefined
- set:在设置属性时调用的函数,默认为undefined
- 访问器属性的定义必须通过Object.defineProperty()来定义
- 只指定get,即设置为对象不可写
- 只指定set,即设置为对象不可读
定义多个属性
- Object.defineProperties()可同时定义多个属性
读取属性特性
- Object.getOwnPropertyDescriptor()方法,接收两个参数,第一个参数为需要读取的属性所在的对象,第二个参数为需要读取的属性特性的属性名
创建对象
工厂模式
function obj(name,age,job){ var o=new Object() o.name=name o.age=age o.job=job return 0 } var person=obj('仇益阳',24,'web前端工程师')
构造函数模式
function Obj(name,age,job){ this.name=name this.age=age this.job=job } var person=new Obj('仇益阳',24,'web前端工程师') 构造函数函数名始终以大写字母开头,非构造函数以小写字母开头
原型模式
- prototype:这个属性是一个指针,指向一个原型对象
- prototype.isPrototypeOf()可判断判断此构造函数是否继承于这个原型
- hasOwnProperty('name') :对象实例本身是否有'name'这个属性
原型与in操作符:
单独使用:判断对象能否访问该属性,能访问返回true,无论是在原型中还是在实例中,否则反之 在fon-in循环中使用:遍历循环 Object。keys(Obj):获取对象上可遍历的属性,只返回当前实例有的属性
- 更简单的原型语法
原型对象的问题
- 默认情况下所有实例都将取得相同的属性值
继承
原型链继承
基本方式
function SuperType(){ this.property=true } SuperType.prototype.getSuperValue=function(){ return this.property } function SubType(){ this.subproperty=false } // 继承了SuperType SubType.prototype=new SuperType() SubType.prototype.getSubValue=function (){ return this.subproperty } var instance=new Subtype() alert(instance.getSuperValue())
- 给原型添加方法必须要放在替换原型之后
- 用对象字面量创建原型是会重写原型链
原型链的问题
- 引用类型的的原型属性会被所有实例继承
- 在创建子类型的实例时,不能向超类行的构造函数中传递参数
借用构造函数(伪造类型或者经典继承)
通过apply()和call()继承
function SuperType(){ this.property=true } function SubType(){ SuperType.call(this) } var instance=new Subtype() alert(instance.property)
可传递参数
function SuperType(name){ this.name=name this.age=23 } function SubType(){ SuperType.call(this,'仇益阳') } var instance=new Subtype() alert(instance.name)
借用构造函数的问题
- 方法都在构造函数里,没法复用
组合继承
- 原型继承和构造函数相结合
- 原型继承通用的属性和方法
- 构造函数继承差异化属性和方法
原型式继承
- 使用Object.create()
- 寄生式继承
- 寄生组合式继承
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。