对象属性、原型与原型链

哈哈哈,我的第二篇博客哟,说的是对象属性、原型与原型链。可能这些只是某些小点串联起来的,逻辑性没有很强。所以会对文章的可读性和理解性带来一些困扰。不过,今天我又前进了那么一小步,为之后的学习又打下了那么一丢丢的基础,虽然理解的不是特别好,不过我还会理解第二次,第三次。恩。加油!

【对象】

对象中包含一系列的属性。这些属性都是无序的,每个属性都有一个字符串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)——对象属性、原型与原型链的更多相关文章

  1. JavaScript 访问对象属性和方法及区别

    这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...

  2. javascript --- 将共享属性迁移到原型中去

    当我们用一个构造函数创建对象时,其属性就会被添加到this中去.并且被添加到this中的属性实际上不会随着实体发生改变,这时,我们这种做法显得会很没有效率.例如: function her(){ th ...

  3. 转: JavaScript 获取对象属性和方法

    一.获取对象属性和方法 Object.keys()for in 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返回的数组的所有属性(可枚举或不可枚举 ...

  4. JavaScript 获取对象属性和方法

    ShineJaie 原创整理,转载请注明出处. 一.获取对象属性和方法 Object.keys() 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返 ...

  5. JavaScript 之 对象属性的特性 和defineProperty方法

    对象是无序属性的集合,而这些属性在创建是都带有一些特征值(可以理解为属性的属性,天生自带的),这些特征值是为了实现JavaScript引擎用的,因此JavaScript不能直接访问. JavaScri ...

  6. JavaScript读取对象属性遇到的问题

    JavaScript中对于对象的属性存取方式有两种:“.”操作和[]操作. “.”操作属性名通常直接写,[]操作中属性的名字通常要加引号, 而当需要读取的对象属性名是一个变量的时候,一般使用[]操作, ...

  7. javascript window对象属性和方法

    window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的 ...

  8. 浅析JavaScript访问对象属性和方法及区别

    属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸.跳跃等. 在JavaScript中通常使用”."运算符来存取对象的属性的值.或 ...

  9. javascript中对象属性的介绍

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 谈谈JavaScript Navigator 对象属性

    Navigator 对象属性 可以在Navigator对象上使用以下属性: 属性 描述 appCodeName 返回浏览器的代码名称 appName 返回浏览器的名称 appVersion 返回浏览器 ...

随机推荐

  1. kettle 连接Hadoop 遇错

    kettle从windows中往hdfs中写文件

  2. NHibernate初步使用

    1.创建一个网站项目:QuickStart 2.引用程序集:NHibernate.dll 3.更改配置文件加入以下节点: <configSections> <section name ...

  3. 在block函数中规避错误信息 "capturing self strongly in this block is likely to lead to a retain cycle”

    以形如 _fontValueChangedBlock = ^(){ [self.fontSmallButton addTarget:self action:@selector(btnFontSmall ...

  4. Pyramid of Glasses(递推)

    Pyramid of Glasses time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  5. C#未将对象引用设置到对象的实例

    未将对象引用设置到对象的实例,这个错误的意思是对象为null,但你还要去取里面的值,所以计算机就不干了.解决办法一般是:用一个你不能确定是不是为null的对象时,尽量做个判断.if(object!=n ...

  6. Oracle技术整理(转载)

  7. js第一天 innerHTML和value 的区别

    innerHTML在JS是双向功能:获取对象的内容 或 向对象插入内容:如:<div id="aa">这是内容</div> ,我们可以通过 document ...

  8. LeetCode OJ 107. Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  9. 自定义 IP 地址

    可以在安装的时候,点击网络配置 1.修改网卡配置 编辑:vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如 ...

  10. LCA-倍增法(在线)O(nlogn)-O(logn)

    1. DFS预处理出所有节点的深度和父节点 inline void dfs(int u) { int i; ;i=next[i]) { if (!deep[to[i]]) { deep[to[i]] ...