一、编程思想
面向过程:以过程为中心,自顶向下逐步细化,程序看成一系列函数调用的集合
面向对象:对象作为程序的基本单元,程序分解为数据和相关操作
二、类、对象
类:对具有相同特性和特征事物的抽象描述
对象:某种类型对应的具体事物
三、面向对象的三大特性
封装:隐藏实现细节,实现代码模块化
继承:扩展已存在的代码模块,实现代码重用
多态:接口的不同实现方式,实现接口重用
四、对象定义:无序属性的集合,其属性可以包含基本值、对象或者函数
//简单的对象实例 var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); }
五、内部属性类型:内部属性无法直接访问,ECMAScript5把它们放在两对方括号中,分为数据属性和访问器属性
[1]数据属性包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有4个特性:
a、[[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,直接在对象上定义的属性,默认值为true
b、[[Enumerable]]: 表示能否通过for-in循环返回属性,直接在对象上定义的属性,默认值为true
c、[[Writable]]: 表示能否修改属性的值,直接在对象上定义的属性,默认值为true
d、[[Value]]: 包含这个属性的数据值,读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。直接在对象上定义的属性,默认值为undefined
[2]访问器属性不包含数据值,包含一对getter和setter函数(不过这两个函数不是必需的)。读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理函数。访问器属性有如下4个特性:
a、[[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。直接在对象上定义的属性,默认值为true
b、[[Enumerable]]: 表示能否通过for-in循环返回属性,直接在对象上定义的属性,默认值为true
c、[[Get]]: 在读取属性时调用的函数。默认值为undefined
d、[[Set]]: 在写入属性时调用的函数。默认值为undefined
六、修改内部属性:使用ECMAScript5的object.defineProperty()方法,该方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象
[注意1]IE8是第一个实现Object.defineProperty()方法的浏览器版本。然而,这个版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器属性。由于实现不彻底,不建议在IE8中使用Object.defineProperty()方法
[注意2]不支持Object.defineProperty()方法的浏览器中不能修改[[Configurable]]和[[Enumerable]]
[1]修改数据属性
//直接在对象上定义的属性,Configurable、Enumerable、Writable为true var person = { name:'cook' }; Object.defineProperty(person,'name',{ value: 'Nicholas' }); alert(person.name);//'Nicholas' person.name = 'Greg'; alert(person.name);//'Greg'
//不是在对象上定义的属性,Configurable、Enumerable、Writable为false var person = {}; Object.defineProperty(person,'name',{ value: 'Nicholas' }); alert(person.name);//'Nicholas' person.name = 'Greg'; alert(person.name);//'Nicholas'
//该例子中设置writable为false,则属性值无法被修改 var person = {}; Object.defineProperty(person,'name',{ writable: false, value: 'Nicholas' }); alert(person.name);//'Nicholas' person.name = 'Greg'; alert(person.name);//'Nicholas'
//该例子中设置configurable为false,则属性不可配置 var person = {}; Object.defineProperty(person,'name',{ configurable: false, value: 'Nicholas' }); alert(person.name);//'Nichols' delete person.name; alert(person.name);//'Nicholas'
[注意]一旦把属性定义为不可配置的,就不能再把它变回可配置了,也就是说可以多次调用Object.defineProperty()修改同一属性,但在把configurable设置为false之后,就有限制了
var person = {}; Object.defineProperty(person,'name',{ configurable: false, value: 'Nicholas' }); //会报错 Object.defineProperty(person,'name',{ configurable: true, value: 'Nicholas' });
[2]修改访问器属性
//简单的修改访问器属性的例子 var book = { _year: 2004, edition: 1 }; Object.defineProperty(book,'year',{ get: function(){ return this._year; }, set: function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.year)//2005 alert(book.edition);//2
[注意1]只指定getter意味着属性是不能写
var book = { _year: 2004, edition: 1 }; Object.defineProperty(book,'year',{ get: function(){ return this._year; }, }); book.year = 2005; alert(book.year)//2004
[注意2]只指定setter意味着属性不能读
var book = { _year: 2004, edition: 1 }; Object.defineProperty(book,'year',{ set: function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.year);//undefined
【补充】创建访问器属性的用两个非标准的方法:__defineGetter__()和__defineSetter__()
var book = { _year: 2004, edition: 1 }; //定义访问器的旧有方法 book.__defineGetter__('year',function(){ return this._year; }); book.__defineSetter__('year',function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } }); book.year = 2005; alert(book.year);//2005 alert(book.edition);//2
七、定义多个属性:ECMAScript5定义了一个Object.defineProperties()方法,利用这个方法可以通过描述符一次定义多个属性,这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象要添加或修改的一一对应
var book = {}; Object.defineProperties(book,{ _year: { value: 2004 }, edition: { value: 1 }, year: { get: function(){ return this._year; }, set: function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } } });
八、读取属性特性:使用ECMAScript5的Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。该方法接收两个参数:属性所在对象和要读取其描述符的属性名称,返回值是一个对象。
[注意]可以针对任何对象——包括DOM和BOM对象,使用Object.getOwnPropertyDescriptor()方法
var book = {}; Object.defineProperties(book,{ _year: { value: 2004 }, edition: { value: 1 }, year: { get: function(){ return this._year; }, set: function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } } }); var descriptor = Object.getOwnPropertyDescriptor(book,'_year'); alert(descriptor.value);//2004 alert(descriptor.configurable);//false alert(typeof descriptor.get);//'undefined' var descriptor = Object.getOwnPropertyDescriptor(book,'year'); alert(descriptor.value);//'undefined' alert(descriptor.configurable);//false alert(typeof descriptor.get);//'function'
以上就是关于javascript面向对象的详细内容介绍,希望对大家的学习有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 群星.1992-电视金曲巡礼VOL.2【EMI百代】【WAV+CUE】
- 廖昌永《情缘HQ》头版限量[低速原抓WAV+CUE]
- 蔡琴《老歌》头版限量编号MQA-24K金碟[低速原抓WAV+CUE]
- 李嘉《国语转调》3CD[WAV+CUE]
- 谭咏麟《爱的根源 MQA-UHQCD》2022头版限量编号 [WAV+CUE][1G]
- 江洋 《江洋原创琵琶作品专辑》[320K/MP3][118.08MB]
- 江洋 《江洋原创琵琶作品专辑》[FLAC/分轨][228.33MB]
- 《战舰世界》语音包文件夹位置介绍
- 《CSGO》送好友皮肤方法介绍
- 《山羊模拟器重制版》发售平台说明
- 刘德华2002-美丽的一天[香港首批大包装首版][WAV]
- 刘文正《金装刘文正不朽经典金曲》2CD(1995环星)][WAV+CUE]
- 周慧敏《94美的化身演唱会》宝丽金1995港版2CD[WAV+CUE]
- 娃娃.1997-精选180绝版冠军精丫滚石】【WAV+CUE】
- 娃娃.1997-精选290巅峰情歌经典【滚石】【WAV+CUE】