对象属性、原型与原型链

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

【对象】

对象中包含一系列的属性。这些属性都是无序的,每个属性都有一个字符串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. aspnet5备忘

    1. 在Windows下面运行cmd,然后执行下面的命令 @powershell -NoProfile -ExecutionPolicy unrestricted -Command "&am ...

  2. [ An Ac a Day ^_^ ] CodeForces 691F Couple Cover 花式暴力

    Couple Cover Time Limit: 3000MS   Memory Limit: 524288KB   64bit IO Format: %I64d & %I64u Descri ...

  3. (转载)app ico图标字体制作

    图标字体化浅谈   在做手机端Web App项目中,经常会遇到小图标在手机上显示比较模糊的问题,经过实践发现了一种比较好的解决方案,图标字体化.在微社区项目中,有很多小的Icon(图标),如分享.回复 ...

  4. 接口post +json +bean

    public ReturnBean<DealBean> getMember(String tagtype, String tag) { try { String requestUrl = ...

  5. 3.编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。

    Account package com.hanqi.test; public class Account { private String zhanghao;private double yve; A ...

  6. 值得一提:关于 HDFS 的 file size 和 block size

    转 http://blog.csdn.net/samhacker/article/details/23089157?utm_source=tuicool&utm_medium=referral ...

  7. javascript中函数的call,apply及bind方法

    call 方法调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,  [,.argN]]]]])参数thisObj可选项.将被用作当前对象的对象. ...

  8. 小飞淙在博客上的第一天——NOIP201505转圈游戏

    原本我是在word文档上写这种东西的,在杨老师的“强迫”下,我开始写了博客. 这是我在博客上的第一天,就先来个简单的,下面请看题: 试题描述  有n个小伙伴(编号从0到n-1)围坐一圈玩游戏.按照顺时 ...

  9. 有关android安全性的问题--代码混淆

    转自:http://www.cnblogs.com/dream-sky/archive/2012/11/15/2771648.html 在project.properties里加上   proguar ...

  10. thinkphp的model模型的设计经验总结

    关于模型:跟上篇文章thinkphp的目录结构设计经验总结写控制器一个道理:为了尽量避免改动到框架: 首先我们是要有一个BaseModel.class.php作为我们的基础model: 我会在Base ...