JS中的对象之原型
对象
ECMAScript做为一个高度抽象的面向对象语言,是通过_对象_来交互的。即使ECMAScript里边也有_基本类型_,但是,当需要的时候,它们也会被转换成对象。
一个对象就是一个属性集合,并拥有一个独立的prototype(原型)对象。这个prototype可以是一个对象或者null。
var foo={
x: 10,
y:20
};
我们拥有一个这样的结构,两个明显的自身属性和一个隐含的_proto_属性,这个属性
是对foo原型对象的引用:
这些prototype有什么用?让我们以_原型链_(prototype chain)的概念来回答这个问题。
原型链
原型对象也是简单的对象并且可以拥有它们自己的原型。如果一个原型对象的原型是一个非null的引用,那么以此类推,这就叫作_原型链_。
原型链是一个用来实现继承和共享属性的有限对象链。
ECMAScript中没有类的概念。但是,代码重用的风格并没有太多不同(尽管从某些方面来说比基于类(class-based)的方式要更加灵活)并且通过_原型链_来实现。这种继承方式叫作_委托继承_(delegation based inheritance)(或者,更贴近ECMAScript一些,叫作_原型继承_(prototype based inheritance))。
var a = {
x: ,
calculate: function(z) {
return this.x + this.y;
}
} ; var b = {
y:,
_proto_:a
}; var c = {
y: ,
_proto_:a
} // call the inherited method b.calculate(); //
c.calculate(); //
这样我们通过将a作为一个属性值赋值给b, c的_proto_属性;
足够简单,这就是通过原型链实现的。
看看规则:如果一个属性或者方法在_自身_中无法找到(也就是说是对象自身没有一个那样的属性),然后他就会尝试在原型链中寻找这个属性/方法。如果这个属性没有在原型中找到,那么将会查找这个原型的原型,以此类推,遍历整个原型链(当然这在类继承中也是一样的,当解析一个继承的_方法_的时候-我们遍历_class链_( class chain))。第一个被查找到的同名属性/方法会被使用。因此,一个被查找到的属性叫作_继承_属性。如果在遍历了整个原型链之后还是没有查找到这个属性的话,返回undefined
值。
注意,继承方法中所使用的this
的值被设置为_原始_对象,而并不是在其中查找到这个方法的(原型)对象。也就是,在上面的例子中this.y
取的是b
和c
中的值,而不是a
中的值。但是,this.x
是取的是a
中的值,并且又一次通过_原型链_机制完成。
如果没有明确为一个对象指定原型,那么它将会使用__proto__
的默认值-Object.prototype
。Object.prototype
对象自身也有一个__proto__
属性,这是原型链的_终点_并且值为null
。
JS中的对象之原型的更多相关文章
- js中的对象、原型链机制、构造函数
一.在js中创建对象的方式 //一.字面量或直接量创建对象 var obj1 = { name:"zs", age:12 }; //二.通过new来创建对象 var obj2 = ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- Js中Map对象的使用
Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...
- JS中的对象和方法简单剖析
众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...
- 深入理解JS中的对象(一)
目录 一切皆是对象吗? 对象 原型与原型链 构造函数 参考 1.一切皆是对象吗? 首先,"在 JavaScript 中,一切皆是对象"这种表述是不完全正确的. JavaScript ...
- 深入理解JS中的对象(二):new 的工作原理
目录 序言 不同返回值的构造函数 深入 new 调用函数原理 总结 参考 1.序言 在 深入理解JS中的对象(一):原型.原型链和构造函数 中,我们分析了JS中是否一切皆对象以及对象的原型.原型链和构 ...
随机推荐
- iOS与HTML交互问题
一. 加载后台传过来的HTML标签,文字都能正常显示但是图片显示不了.找问题找了很久没有发现那个地方写错,也问了别人都不知道,后来问了Android才知道,后台传过来的HTML标签,有些是转义过的.移 ...
- [办公应用]让WORD自动显示到四级目录
一般情况下,word的目录默认显示到三级目录.如果需要显示到四级目录,你会怎么操作呢? 只要按下图所示,单击“插入”-“引用”-“索引和目录” 然后单击“目录”选项卡,将“显示级别”处的3改为4即可. ...
- 跨域,Content-Type组件
1,跨域:是浏览器的同源策略 阻止ajax请求不组织src请求 2,一个源的定义:如果两个页面的协议,端口(如果由指定)和域名都相同,则两个页面具有相同的源 下面给出相对http://a.xyz.co ...
- YTU 2864: 分跑道。
2864: 分跑道. 时间限制: 1 Sec 内存限制: 128 MB 提交: 23 解决: 19 题目描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原 ...
- gfnormal 域名 是阿里云的高防IP
最近DGA检出了一堆阿里高防的域名,例如:u3mbyv2siyaw2tnm.gfnormal09aq.com,然后专门查找了下相关文档. 例如 8264.com 这个网站启用了aliyun的高防DDo ...
- word2vec中的数学原理(转)
- jQuery得到多个值只能用取Class ,不能用取ID
如果页面有多个checkbox: <input type="checkbox" class="checkApply" id="chec ...
- Uncaught ReferenceError: is not defined
今天,遍历一个HashSet集合对象,想用链接绑定集合对象的值,通过POST方式提交到控制器.结果程序无反应,按F12键进入调试模式,谷歌总是提示Uncaught ReferenceError: ...
- VMware 12PRO安装Mac OS X 10.10.5
插件安装 步骤一完成后,打开任务管理器,找到服务项,选择按名称排序,将框中四项全部停止运行. 然后打开下载的插件,解压unlocker206.zip文件,找到 unlocker206\win-in ...
- jquery ajax post请求实例
function test(){ $.ajax({ //提交数据的类型 POST GET type:"POST", //提交的网址 url:"testLogin.aspx ...