JavaScript(2)——对象属性、原型与原型链
对象属性、原型与原型链
哈哈哈,我的第二篇博客哟,说的是对象属性、原型与原型链。可能这些只是某些小点串联起来的,逻辑性没有很强。所以会对文章的可读性和理解性带来一些困扰。不过,今天我又前进了那么一小步,为之后的学习又打下了那么一丢丢的基础,虽然理解的不是特别好,不过我还会理解第二次,第三次。恩。加油!
【对象】
对象中包含一系列的属性。这些属性都是无序的,每个属性都有一个字符串key和对应的value。
创建自定义对象的最简单方式就是创建一个object实例,然后再为它添加属性和方法。
属性类型:数据属性和访问属性。
数据属性:
configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性等。这个特性默认值为true。
enumerable:表示能否通过for-in循环返回特性。这个特性默认值为true。
writable:表示能否修改属性的值。这个特性默认值为true。
value:包含这个属性的数据值。读取属性值的时候,在这个位置读取,写入属性值的时候,把新值保存在这个位置。这个特性默认值为undefined。
要修改默认属性,必须使用Object.defineProperty()方法。
可以多次调用Object.defineProperty()方法修改同一个属性,但把configurable特性设置为false之后就会有限制了。
访问器属性:
访问器属性不包含数据值,他们包含一对getter和setter函数(非必需)。getter函数负责返回有效的值;setter函数负责如何处理数据。
访问器属性一共有四个特性,除了configurable和enumerable之外,还有get和set方法,get在读取属性时被调用,set在写入属性时被调用。且默认值都为undefined。
在不支持Object.defineProperty()方法的浏览器中不能修改configurable和enumerable。
【原型与原型链】
原型模式:我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象包含可以由特定类型的所有实例共享属性和方法,而使用原型对象,可以让所有对象实例共享它所包含的属性和方法。字面理解的话,prototype就是通过调用构造函数而创建那个对象实例的原型对象。
原型对象:无论什么时候,只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向原型对象。在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。
使用hasOwnProperty()方法可以检测一个属性是存在于实例中还是存在于原型中。原型返回false,实例返回true。
原型与in操作符:in操作符可以单独使用,也可以在for-in循环中使用,而且同时使用in操作符和hasOwnProperty()就可以确定属性到底存在于对象还是原型中。如:
function Person(){}
Person.prototype.name="smile";
Person.prototype.age=19;
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Preson();
alert(person1.hasOwnProperty("name"));//false
alert("name" in person1); //true
只要in操作符返回true,hasOwnProperty()返回false,就可以确定属性是原型中的属性。
原型链:原型链是实现继承的主要方法。基本思想是利用原型让一个引用类型继承另一个引用类型的方法。对于构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包括一个指向构造函数的指针,而实例都包含一个指向对象内部的指针。假如我们让原型对象等于另一个类型实例,那么此时的原型对象包含一个指向另一个原型指针,相应的,另一个原型也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,如此层层递进,就构成了实例与原型的链条。这就是原型链的基本概念。而且,在原型链的末端一定是null。
在通过原型链实现继承的情况下,搜索过程就得沿着原型链继续向上。
所有引用类型默认都继承了Object,而这个继承是通过原型链来实现的。所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向Object.prototype。
原型链的问题:
原型链中的包含引用类型值的原型属性会被所有实例共享,而这也是为什么要在构造函数中,而不是原型函数中定义属性的原因。在通过原型实现继承时,原型实际上会变成另一个类型的实例。于是,原先的属性也顺理成章的变成了现在的原型属性了。
在创建子类型的实例时,不能向超类型的构造函数中传递参数。
JavaScript(2)——对象属性、原型与原型链的更多相关文章
- JavaScript 访问对象属性和方法及区别
这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...
- javascript --- 将共享属性迁移到原型中去
当我们用一个构造函数创建对象时,其属性就会被添加到this中去.并且被添加到this中的属性实际上不会随着实体发生改变,这时,我们这种做法显得会很没有效率.例如: function her(){ th ...
- 转: JavaScript 获取对象属性和方法
一.获取对象属性和方法 Object.keys()for in 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返回的数组的所有属性(可枚举或不可枚举 ...
- JavaScript 获取对象属性和方法
ShineJaie 原创整理,转载请注明出处. 一.获取对象属性和方法 Object.keys() 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返 ...
- JavaScript 之 对象属性的特性 和defineProperty方法
对象是无序属性的集合,而这些属性在创建是都带有一些特征值(可以理解为属性的属性,天生自带的),这些特征值是为了实现JavaScript引擎用的,因此JavaScript不能直接访问. JavaScri ...
- JavaScript读取对象属性遇到的问题
JavaScript中对于对象的属性存取方式有两种:“.”操作和[]操作. “.”操作属性名通常直接写,[]操作中属性的名字通常要加引号, 而当需要读取的对象属性名是一个变量的时候,一般使用[]操作, ...
- javascript window对象属性和方法
window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的 ...
- 浅析JavaScript访问对象属性和方法及区别
属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸.跳跃等. 在JavaScript中通常使用”."运算符来存取对象的属性的值.或 ...
- javascript中对象属性的介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 谈谈JavaScript Navigator 对象属性
Navigator 对象属性 可以在Navigator对象上使用以下属性: 属性 描述 appCodeName 返回浏览器的代码名称 appName 返回浏览器的名称 appVersion 返回浏览器 ...
随机推荐
- [kuangbin带你飞]专题四 最短路练习 POJ 2253 Frogger
求第一个点到第二个点的所有通路上最长的边 dijkstra的变形 每次松弛的是每条边通路上的的最长的边 WA了好几次是因为用了%lf 改成%f就过了…… /* ******************** ...
- updateMany
db.tblDaily.updateMany( {"Comments.ViewCount":0}, {$addToSet:{"Comments.$.CommentDate ...
- Openjudge-计算概论(A)-求特殊自然数
描述: 一个十进制自然数,它的七进制与九进制表示都是三位数,且七进制与九进制的三位数码表示顺序正好相反.编程求此自然数,并输出显示. 输入为1时,输出此自然数的十进制表达式:输入为2时,输出此自然数的 ...
- logrotate日志轮转配置文档
转自:http://blog.163.com/bull_linux/blog/static/2138811422013101334544349/ 使用: logrotate CONF_FILE+ ...
- Excel补全日期(日期按顺序补全)
1.给出的数据 2.想补全缺失的日期,比如2015/3/1,2015/3/2,... 1)在D列输入完整的日期,如下图所示: 2)在E2处写函数“=IF(ISERR(VLOOKUP(D2,B:C,2, ...
- MFC下MCI的使用播放音乐
最近研究了一下MFC下的音乐的播放,主要使用了MCI 1.需要包含的库文件 在链接资源里(link)添加库文件VFW32.lib winmm.lib 2.包含的头文件 #include <mms ...
- md5校验问题
描述: 最近跟同事做数据对接,接收完数据,有个md5校验,发现总是对不上 首先把解密之后的明文直接写成变量在md5的工具类main函数执行,发现居然对上了, 然后测试环境debug接收的文件,md5加 ...
- asp下sha1加密函数
sha1.asp文件 <script language="javascript" type="text/javascript" runat="s ...
- Nginx访问限速配置方法详解
开发测试阶段在本地限速模拟公网的环境,方便调试.投入运营会有限制附件下限速度,限制每个用户的访问速度,限制每个IP的链接速度等需求. 配置简单,只需3行,打开"nginx根目录/conf/n ...
- redis3--key的操作
我们之前使用Redis简单存储了三个参数:在语句set name jack中,其中name就是一个key.我们Java中的变量名是有一定规则的,比如组成内容可以是"数字",&quo ...