js 中对象--对象结构(原型链基础解析)
对于本篇对于如何自定义对象、和对象相关的属性操作不了解的话,可以查我对这两篇博客。了解这两篇可以更容易理解本篇文章
用构造函数创建了一个对象
obj对象的本身创建了两个属性 x=1 ,y=2
对象本的的两个属性都有属性特征 writable是否可写的,enumerable是否可枚举的 configurable是否可重置的,getter ,setter
obj对象本身也有三大特性 proto 原型 class 类 extensible可拓展
foo.prototype是对象上的原型 , foo.prototype也是个对象。
z=3是foo.prototype是对象上原型的属性。
再往上object.prototype是一个顶级属性,是所有对象的原型。
再上往上就是null 空了。 此时就形成了一个原型链。
我再用代码来一一解析,用演示代码再向大家详细解释:
<script>
function Foo(){ //声名一个函数FOO }
alert(typeof Foo.prototype) //Foo.prototype 是一个对象。也可以是obj对象上的原型
Foo.prototype.z =3 //设置了原型属性z为3
var obj = new Foo() //用构建函数来创建了obj对象
obj.x = 1; //x=1是obj对象上本身的属性
obj.y = 2; //y=2是obj对象上本身的属性
alert(obj.x) //=>1 对过查询对象,我们是否得到这个属性值
alert(obj.y) //=>1 对过查询对象,我们是否得到这个属性值
alert(obj.z) //=》3 z不是obj本身的属性,是他原型上的属性,如果本身没有,可以向他的原型链上的原型来查找,得到z属性
alert(obj.toString())//=toString是顶级object对象上的属性,先是查找原型上有没有这个属性,如果没有再往原型链上顶级的object对象上找
</script>
再来了解一下得到对象上属性的优先级。
如果在对象本身上有这个属性,则得到的是对象上本身的属性。
如果对象本身上有这个属性,则向他的原型上查找。
如果再没有再向顶级属性上查找。
如果原型上和对象本身上都有这个属性,则还是先用对象本身的属性
为了让大家更好的了解,演示代码如下:
<script>
function Foo(){ //声名一个函数FOO }
Foo.prototype.z =3 //设置了原型属性z为3
var obj = new Foo() //用构建函数来创建了obj对象
obj.z = 5 //定义对象的属性Z = 5
alert(obj.z) //=>5 如果对象上本身定义了属性z ,则先用对象本身的属性
delete obj.z; //删除对象上本身的属性
alert(obj.z); //=>3再次获取对象的z,结果发现对象本身z的属性被删除了,会自动往对象的原型上查找,得到z=3
delete Foo.prototype.z; //删除对象原型上的z属性
alert(obj.z) //=> undefined 因为对象本身的z属性被删除,原型上的z属性也被删除,再继续往顶级对象Object上查找,没有此属性,返回undefined
</script>
通过 var obj = Object.create({x:1}) 来创建对象来解析对象、对象上的原型
其实obj.create圆括号里面定义对象和属性就是obj对象的原型和原型属性,
演示代码如下:
<script>
var obj = Object.create({z:4}) //Object.create({z:4})是一个对象上的一个原型,z是原型上的属性
obj.x = 1 //x是对象本身的属性
obj.z = 3 //z是对象本身的属性
alert(obj.x) //=>1 输出的是对象本身的x
alert(obj.z) //=>3 输出的是对象本身的z
delete obj.z; //当我们删除对象本的z
alert(obj.z) //就是会向原型上面查找原型上有没有这个属性,如果有,z指的是原型上的属性
</script>
通过In来解释某个对象上是否有这个属性:
演示代码如下:
<script>
//用 属性 In 对象来检测 是否是对象上的属性,返回true否是,返回false 则不是
function Foo(){ }
Foo.prototype.z = 5
var obj = new Foo()
obj.x = 1 ;
obj.y = 2;
alert("x" in obj) //=>true x是对象上本身定义的属性
alert("y" in obj) //=>true y也是对象上本身定义的属性
alert("z" in obj) //=>true z是从对象原型上继承来的属性
alert("toString" in obj) //=>true toString是从顶级对象Object上继承来的属性
alert("no" in obj) //=>false 对象本上没有,查找整个原型链都没有这个属性直到null 则反回false,
</script>
通过hasOwnProperty查找是否是对象本身的属性,而不是继承来的属性
<script>
//用对象.hasOwnProperty("属性") 来检测是否是对象本身的属性,而不是继承来的
function Foo(){ }
Foo.prototype.z = 5
var obj = new Foo()
obj.x = 1 ;
obj.y = 2;
alert(obj.hasOwnProperty("x")) //=>true x是对象本身定义的属性,所以返回true
alert(obj.hasOwnProperty("z")) //=>false z是对象原型上继承的属性,所以返回false
alert(obj.hasOwnProperty("toString")) //=>false toString是顶级对象上继承来的属性,所以返回false
</script>
我们最后来看看用var obj = Objcet.create()来创建的对象如何来检测他的属性。
如果想没有任何继续属性的话可以写 var obj = Object.create(null) 则不继承任何属性
演示代码:
<script>
var obj = Object.create({x:1})
obj.y = 2
alert("y" in obj) //=>true
alert("x" in obj) //=>true
alert("toString" in obj) //=>true
alert(obj.hasOwnProperty("x")) //=>false
alert(obj.hasOwnProperty("y")) //=>true
var obj1 = Object.create(null)
alert("toString" in obj1) //=>false 创建了一个不继承任何属性的对象obj1,直到顶级对象Object对象都不继承
</script>
js 中对象--对象结构(原型链基础解析)的更多相关文章
- JS中关于构造函数、原型链、prototype、constructor、instanceof、__proto__属性
在Javascript不存在类(Class)的概念,javascript中不是基于类的,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但是在ES6中引入 ...
- 探讨一下js中的继承和原型链
---恢复内容开始--- 每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法. 也就是说 对象的__proto__属性的值就是它所对应的原型对象, 而prototype 只有函数才有的属性. ...
- JS中的继承(原型链、构造函数、组合式、class类)
1.继承 应注意区分继承和实例化,实例化是生成一个对象,这个对象具有构造函数的属性和方法:继承指的应该是利用父类生成一个新的子类构造函数,通过这个子类构造函数实例化的对象,具有子类的属性和方法,同时也 ...
- JS function 是函数也是对象, 浅谈原型链
JS function 是函数也是对象, 浅谈原型链 JS 唯一支持的继承方式是通过原型链继承, 理解好原型链非常重要, 我记录下我的理解 1. 前言 new 出来的实例有 _proto_ 属性, 并 ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
- 深入理解JS中的对象(一)
目录 一切皆是对象吗? 对象 原型与原型链 构造函数 参考 1.一切皆是对象吗? 首先,"在 JavaScript 中,一切皆是对象"这种表述是不完全正确的. JavaScript ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
随机推荐
- Gof-23种设计模式名称列表
工欲善其事,必先利其器. 在真正使用设计模式之前,必须知道各个设计模式对应的场景.设计模式是针对某种固定的场景下产生的固定解决方案.只有明确的场景,才会有明确的设计方式和方法. 设计模式全集: Abs ...
- linux ssh scp无密码登录
一. 应用场景 假如你Linux Client是客户端, Server为服务器,用户名为user.现在要配置从Client到Server的无密码SSH登录或者无密码的scp拷贝. 例如客户端Clien ...
- 理解标签重置reset
/*样式表文件来自 懒人css http://lrcss.lrjz100.com *//*---------重置---------*/html{font-size: 100%;-webkit-text ...
- 更改Sublimetext3的主题文件,改变某些不喜欢的颜色
使用的主题是Monokai(SL),主题很好看,但是注释和内容选中的颜色看起来跟没有一个样,看起来很淡,所以稍微改一下主题文件的颜色.
- JQuery和UpdatePannel的问题
转: http://www.cnblogs.com/Tim_Liu/archive/2010/11/25/1887937.html 最近在做一个项目,因为涉及到的字段数量很多所以想偷把懒,便使用了Up ...
- PureMVC(JS版)源码解析(九):View类
在讲解View类之前,我们先回顾一下PureMVC的模块划分: 在PureMVC中M.V.C三部分由三个单例类管理,分别是Model/View/Controller.PureMVC中另外一个 ...
- Freemarker学习中遇到的问题
在网上找到了尚学堂的视频,同时有书和源码等资料.但是在跟着练习的过程中,代码运行报了错: 2015-7-20 22:26:40 freemarker.log.JDK14LoggerFactory$JD ...
- 也许是关于C#的一些常见误区
写这点东西主要是看到知乎上有人在讨论相关的问题,但是有不少人都在说一些不严谨,甚至是完全错误 但是流传甚广的东西,甚至是一些大神都在说,以下根据我的回答总结. 一个很常见又很低级的误区是:认为引 ...
- 解决升级windows8.1 Oracle服务被刷新
1.调用CMD管理员模式,记得,否则你想要执行的东西都调用不了,win8下“窗口键+X”-“命令提示符(管理员) 2.创建oracle10g.11g的监听服务:(%ORACLE_HOME%为oracl ...
- GUI编程笔记(java)04:GUI(HelloWorld)窗体案例
1.Frame 在JAVA中,Frame是一种控件,可作为父窗体加载其他swing控件.案例: package cn.itcast_01; import java.awt.Frame; public ...