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 空了。  此时就形成了一个原型链。

我再用代码来一一解析,用演示代码再向大家详细解释:

 1 <script>
 2       function Foo(){    //声名一个函数FOO
 3
 4       }
 5       alert(typeof Foo.prototype)    //Foo.prototype 是一个对象。也可以是obj对象上的原型
 6       Foo.prototype.z =3    //设置了原型属性z为3
 7       var obj = new Foo()    //用构建函数来创建了obj对象
 8       obj.x = 1;            //x=1是obj对象上本身的属性
 9       obj.y = 2;           //y=2是obj对象上本身的属性
10       alert(obj.x)         //=>1 对过查询对象,我们是否得到这个属性值
11       alert(obj.y)         //=>1 对过查询对象,我们是否得到这个属性值
12       alert(obj.z)        //=》3 z不是obj本身的属性,是他原型上的属性,如果本身没有,可以向他的原型链上的原型来查找,得到z属性
13       alert(obj.toString())//=toString是顶级object对象上的属性,先是查找原型上有没有这个属性,如果没有再往原型链上顶级的object对象上找
14 </script>

再来了解一下得到对象上属性的优先级。

如果在对象本身上有这个属性,则得到的是对象上本身的属性。

如果对象本身上沿岸有这个属性,则向他的原型上查找。

如果再没有再向顶级属性上查找。

如果原型上和对象本身上都有这个属性,则还是先用对象本身的属性

为了让大家更好的了解,演示代码如下:

 1 <script>
 2       function Foo(){    //声名一个函数FOO
 3
 4       }
 5       Foo.prototype.z =3    //设置了原型属性z为3
 6       var obj = new Foo()    //用构建函数来创建了obj对象
 7       obj.z = 5     //定义对象的属性Z = 5
 8       alert(obj.z)   //=>5  如果对象上本身定义了属性z ,则先用对象本身的属性
 9       delete obj.z;   //删除对象上本身的属性
10       alert(obj.z);   //=>3再次获取对象的z,结果发现对象本身z的属性被删除了,会自动往对象的原型上查找,得到z=3
11       delete Foo.prototype.z;  //删除对象原型上的z属性
12       alert(obj.z)   //=> undefined 因为对象本身的z属性被删除,原型上的z属性也被删除,再继续往顶级对象Object上查找,没有此属性,返回undefined
13 </script>

通过 var obj = Object.create({x:1}) 来创建对象来解析对象、对象上的原型

其实obj.create圆括号里面定义对象和属性就是obj对象的原型和原型属性,

演示代码如下:

1 <script>
2     var obj = Object.create({z:4})  //Object.create({z:4})是一个对象上的一个原型,z是原型上的属性
3       obj.x = 1      //x是对象本身的属性
4       obj.z = 3         //z是对象本身的属性
5       alert(obj.x)     //=>1  输出的是对象本身的x
6       alert(obj.z)     //=>3  输出的是对象本身的z
7       delete obj.z;    //当我们删除对象本的z
8       alert(obj.z)    //就是会向原型上面查找原型上有没有这个属性,如果有,z指的是原型上的属性
9 </script>

通过In来解释某个对象上是否有这个属性:

演示代码如下:

 1 <script>
 2     //用  属性 In  对象来检测 是否是对象上的属性,返回true否是,返回false 则不是
 3      function Foo(){
 4
 5      }
 6      Foo.prototype.z = 5
 7      var obj = new Foo()
 8      obj.x = 1 ;
 9      obj.y = 2;
10      alert("x" in obj)   //=>true x是对象上本身定义的属性
11      alert("y" in obj)   //=>true y也是对象上本身定义的属性
12      alert("z" in obj)   //=>true z是从对象原型上继承来的属性
13      alert("toString" in obj) //=>true toString是从顶级对象Object上继承来的属性
14      alert("no" in obj)   //=>false  对象本上没有,查找整个原型链都没有这个属性直到null 则反回false,
15 </script>

通过hasOwnProperty查找是否是对象本身的属性,而不是继承来的属性

 1 <script>
 2     //用对象.hasOwnProperty("属性") 来检测是否是对象本身的属性,而不是继承来的
 3      function Foo(){
 4
 5      }
 6      Foo.prototype.z = 5
 7      var obj = new Foo()
 8      obj.x = 1 ;
 9      obj.y = 2;
10      alert(obj.hasOwnProperty("x")) //=>true   x是对象本身定义的属性,所以返回true
11      alert(obj.hasOwnProperty("z")) //=>false   z是对象原型上继承的属性,所以返回false
12      alert(obj.hasOwnProperty("toString")) //=>false   toString是顶级对象上继承来的属性,所以返回false
13 </script>

我们最后来看看用var obj = Objcet.create()来创建的对象如何来检测他的属性。

如果想没有任何继续属性的话可以写  var obj = Object.create(null) 则不继承任何属性

演示代码:

 1 <script>
 2      var obj = Object.create({x:1})
 3       obj.y = 2
 4      alert("y" in obj)  //=>true
 5      alert("x" in obj)  //=>true
 6      alert("toString" in obj)  //=>true
 7      alert(obj.hasOwnProperty("x")) //=>false
 8      alert(obj.hasOwnProperty("y"))  //=>true
 9     var obj1 = Object.create(null)
10     alert("toString" in obj1)    //=>false 创建了一个不继承任何属性的对象obj1,直到顶级对象Object对象都不继承
11 </script>
时间: 2024-12-27 22:25:46

js 中对象--对象结构(原型链基础解析)的相关文章

快速理解JS中的继承与原型链

语言是用来表达的工具.当我们需要代指某个东西的时候,通常称其为一个对象.在编程语言中,对象并不像真实世界中那样随处可见,随口可以指代.通常我们只有少数的原生对象,剩下的,需要我们自己去创建.在Java语言中,创建一只会“咯咯咯”叫的鸡时,我们是这么做的: public class Chicken{ public void makeSound(){ System.out.println("咯咯咯"); } } Chicken littleChicken = new Chicken();

浅解析js中的对象

浅解析js中的对象 说到对象,我首先想到的是每逢过年过节,长辈们老是开玩笑的问我“你找了对象没?”.不说大家都知道,这里的“对象”指的是“女朋友”,但是今天我想要说的js中的“对象”和我们生活中谈到的“对象”不是同一回事,但是其中也有着很多相似之处.    在讲js中的对象之前,我想先抛出几个疑问:    什么是对象?    对象有哪些?    对象能做什么?    如何创建对象?    如何对对象进行操作?    对象有特性么?有的话有哪些特性?    对象有属性么?有的话有哪些?对属性如何操

JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实例化的的时候就不用对每个实例定义该属性方法,所有的实例均具有该方的引用见最后的输出. function Myclass(){ this.x=" x in Myclass"; this.get=function(){}//每次实例化对象,每个对象的该方法都是独立的,是不相同的 } Mycla

JavaScript学习12 JS中定义对象的几种方式【转】

avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript

JS中的对象和方法简单剖析

众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): Dates ,Maths,Regexps,Arrays,Funcitons,当然Objects,这些都是对象: JS中,所有值,除了原生值,都是对象:这些原生值包括:strings,numbers('3.14'),true,false,null和undefined 对象是包含变量的变量,js变量可

js中window对象详解以及页面跳转

js中window对象详解以及页面跳转 转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%90%9C/39219.shtml 1.window.top.window.location = "index.asp"; 2.window.top.location.href="index.asp" 3. window.top.location.replace("index.asp");

JavaScript学习12 JS中定义对象的几种方式

JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript"> var object = new Object(); object.name

swfupload js中 file 对象的属性

name=3cc68cfc60b87e6dd6887d8a.jpg modificationdate=Wed   Apr 21 15:48:30 UTC+0800 2010 filestatus=-1 post=[object   Object] type=.jpg index=0 size=29006 creationdate=Wed Apr 21 15:48:38 UTC+0800   2010 id=SWFUpload_0_0swfupload js中 file 对象的属性,布布扣,bub

js实现小时钟,js中Date对象的使用?

介绍一下js中Date对象的使用 dateObj = new Date() dateObj = new Date(dateValue) dateObj = new Date(year,month,date[,hours[,minutes[,seconds[,ms]]]]); 以下有一个小样例 <script type="text/javascript"> function setTime(){ //获得如今的时间 var now = new Date(); var year