javascript——对象

分类

JavaScript对象分类:

内置对象:由ECMAScript规范定义的对象或类,例如:数组、函数、日期(Date())、正则表达式

宿主对象:是由js解释器所嵌入的宿主环境(比如Web浏览器)定义的。

自定义对象:是由运行中的js代码创建的对象

JavaScript属性分类:

自有属性:直接在对象中定义的属性

继承属性:是在对象的原型对象中定义的属性



创建对象

可以通过对象直接量、关键字new、Object.create()函数创建对象

(1)对象直接量:

  最简单的创建对象方式

1 var empty = {};
2 var point = {x:0,y:0};
3 var point2 = {x:point.x,y:point.y+1};
4 var book = {
5                     "main title" : "Javascript",    //属性名字有非法字符一定要用字符串形式(或者保留字(for等)也要用字符串)
6                     "sub-title" : "the Guide",      //同上
7 }    

(2)new关键字创建对象

  new后跟一个构造函数

  

1 var a = new Array();      //创建一个数组,和[]一样
2 var d = new Date();         //创建一个表示当前时间的Date对象
3 var r = new RegExp("js");      //创建一个可以进行模式匹配的RegExp对象

(3)Object.create()创建对象

  这个方法的第一个参数是这个对象的原型,第二个参数可选,用以对对象的属性进行进一步描述。

  这个函数是一个静态函数,使用方法:

  

var o1 = Object.create({x:1,y:2});   //o1继承了属性x和y

  传入参数如果为null,则会创建一个没有原型的新对象,它不会继承任何东西,甚至不包括基础方法,比如:toString(),也就是说它将不能和“+”运算符一起正常工作。

模拟原型继承:

  1 function inherit(p){
  2       if(p==null) throw TypeError();   //若原型对象不存在,则返回错误
  3       if(Object.create)
  4                return Object.create(p);   //若存在这个函数,则直接调用他创建对象
  5       var t = typeof p;
  6       if(t !== "Object" && t !== "function") throw TypeError(); //若传入的原型对象不是一个对象或者构造函数,则返回错误
  7       function f(){};     //定义一个空的构造函数
  8       f.prototype = p;   //将其原型属性设置为p
  9       return new f();     //返回f()创建p的继承对象
10 }


原型:

每一个JavaScript对象(null除外)都和“另外一个对象”相关联,这里的“另一个对象”就是原型对象,我们创建的所有对象都从它的原型对象那里继承属性。

(1)所有通过原型直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获得对原型对象的引用。

(2)通过new Object()创建的对象也继承自Object.prototype,new Array()创建的对象继承自Array.prototype...

(3)没有原型的对象:Object.prototype,所有的对象都继承自该对象。

原型链:一个对象继承多个原型对象,这一系列的链接称为原型链。



属性的查询和设置:

访问属性值时的代码书写规范:

(1)对象名.属性名

(2)对象名["属性名"]

第二种方法可以看做是关联数组,即通过字符串作为下标访问属性,这样就可以很方便的更改属性名。这在很多情况下是很方便代码的编写的,比如属性名需要通过用户进行定义。

查询属性值时代码执行过程:

  如果要访问的对象中不存在该属性,则会继续在该对象的原型对象中查询该属性,如果原型对象中也没有该属性,就继续在该对象的原型对象中查找,直到找到x或者查找到一个原型是null的对象为止。这样的查找过程构成了一个"链",也是通过这个链实现继承的。

属性的赋值的几种情况:

(1)如果该对象中已经有该属性,那么将会用新的值覆盖这个属性值。

(2)如果该对象中不存在该属性,赋值操作会给这个对象添加一个新的属性,并赋给它值。

(3)如果之前该对象继承自该属性,那么这个继承的属性就被新创建的同名属性覆盖。

注意:属性赋值操作首先检查原型链,以此判定是否允许赋值操作,例如,如果该对象继承自一个只读属性x,那么赋值操作是不允许的。如果允许属性赋值操作,它也总是在原始对象上创建属性或对已有的属性赋值,而不会去修改原型链。

属性的赋值在以下情况中会失败:

(1)o中的属性p是只读的:不能给只读属性重新赋值(definedProperty())方法中有一个例外,可以对可配置的只读属性重新赋值。

(2)o中的属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性。

(3)o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性是false。如果o中不存在p,而且没有setter方法可供调用,则p一定会添加至o中。但如果o不是可扩展的,那么在o中不能定义新属性。



属性的删除:

delete运算符可以对属性进行删除。它的操作数是一个属性访问表达式,需要注意的是,delete只是断开了属性和宿主之间的联系,而并没有属性中的属性进行操作:

1 a = {p:{x:1}};
2 b=a.p;
3 delete a.p;

执行完这段代码后,b.x的值依然是1,所以在有些情况中属性的删除要遍历属性中的属性,依次删除,否则会造成内存泄露。

delete运算符只能删掉自有属性,不能删除继承属性,要删除继承属性只能从该对象的原型对象中删除,但要注意这会影响到所有继承该原型对象的对象属性。

delete运算符会返回一个值:

true:删除成功或者没有任何副作用时,即删除一个已经被删除或者不存在的属性或者删除一个非属性的值或者删除一个继承来的属性值

false:

1 delete Object.prototype; //不能删除,属性是不可配置的
2 var x = 1;  //声明一个全局变量
3 delete this.x;  //不能删除这个属性
4 function f(){};  //声明一个全局函数
5 delete this.f;  //也不能删除全局函数
时间: 2024-10-25 22:51:31

javascript——对象的相关文章

JavaScript 对象

JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... 此外,JavaScript 允许自定义对象. JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 建 JavaScript 对象 通过 JavaScript,您能够定义并创建自己的对象. 创建新对象有两种不同的方法: 定义并创建对象的实例 使用函数来定义对象,然后创建新的对象实例

javascript对象简介

javascript对象可分为三大类: 1.javascript本地对象和内置对象 2.浏览器对象(BOM) 3.文档对象(DOM) 一:javascript内置对象 1.Array(数组对象) 2.Number(数字对象) 3.String(字符串对象) 4.Boolean(布尔对象) 5.Math(数学对象) 6.RegExp(正则对象) 7.Date(日期时间对象) 二:浏览器对象(BOM) 1.Window对象: 2.Screen对象:可以获取屏幕的信息 3.Navigator:可以获取

JavaScript对象--------------你又知道那些

今天我和大家带来的是JavaScript对象的一些属性和函数(方法),通过这些了解,我们又能做出那些页面效果呢,下面就来进行今天的主题. 1.完整的JavaScript是由ECMAScript.BOM(浏览器对象模型)和DOM(文档对象模型)构成的.示意图如下: 而window对象是整个BOM的核心,Window对象是客户端javascript最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的网页,当遇到BODY,FRAMESET或FRAME元素时,都会自动建立window对象的实例.

javascript对象的一点理解

<script type="text/javascript"> /* js对象:对象的职责是调用属性和调用方法 */ //1.对象的创建的三种方式 var obj = {}; //常用且不会浪费空间 var obj = new Object(); //var obj = Object.create(); /* 第三种方式测试的时候有问题,百度下,发现 Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象. 参数: prototype 必需. 要用作

JavaScript对象之关联数组

Tip: 内容摘抄自<JavaScript权威指南>,看过该书的同学可以忽略本文. 存取一个对象的属性的方式: obj.attr; obj["attr"]; 两者最重要的区别就是前者的属性名是标示符,后者的属性名是一个字符串. 用"."运算符来存取一个对象的属性时,属性名是标示符,JavaScript程序中,标示符必须被逐字输入,它们不是一种数据类型,因此程序不能对他们进行操作. 用数组的概念"[]"来存取一个对象的属性时,属性名是用

15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图: 相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称之

如何判断Javascript对象是否存在

Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: if (myObj不存在){ 声明myObj; } 你可能会觉得,写出这段代码很容易.但是实际上,它涉及的语法问题,远比我们想象的复杂.Juriy Zaytsev指出,判断一个Javascript对象是否存在,有超过50种写法.只有对Javascript语言的实现细节非常清楚,才可能分得清它们的区别

javascript篇:javascript对象——Math

Math对象用于执行数学任务,无需创建它的实例: var mathPI = Math.PI; var myVal = Math.sqrt(4); Math对象的属性 E:返回算术常量e,约等于2.718 LN2:返回2的自然对数,约等于0.693 LN10:返回10的自然对数,约等于2.302 LOG2E:返回以2为底的e的对数,约等于1.414 LOG10E:返回以10为底的e的对数,约等于0.434 PI:返回圆周率,约等于3.14159 SQRT1_2:返回2的平方根的倒数,约等于0.70

javascript对象转化为基本数据类型规则

原文:Object-to-Primitive Conversions in JavaScript 对象转化为基础数据类型,其实最终都是用调用对象自带的valueOf和toString两个方法之一并获得其返回值,作为其基础数据类型. 基础数据类型包括这么几种:null, undefined, number, boolean, string 内部实现机制 但是什么时候调用valueOf,什么时候调用toString,却困惑了很长一段时间. var obj = { toString: function

JavaScript对象浅谈

JavaScript对象 对象 ECMA-262 把对象(object)定义为"属性的无序集合,每个属性存放一个原始值.对象或函数".严格来说,这意味着对象是无特定顺序的值的数组. 对象是属性和方法的无序集合 对象就是无序属性的集合 尽管 ECMAScript 如此定义对象,但它更通用的定义是基于代码的名词(人.地点或事物)的表示. 在JavaScript中,除了数字.字符串.布尔值.null.undefined这五种原始类型,之外的都是对象,也就是印证了"万物皆对象&quo