- 浏览: 604515 次
- 性别:
- 来自: 北京
最新评论
-
黑色幽默_cool:
这种不负责任的文章,多看一分钟都是浪费。
为什么使用ibatis而不用spring jdbcTemplate -
leibinhui:
不错啊 非常实用
JS正则表达式详解[收藏] -
suu:
写个存储过程,爆如下错误,是不是游标里的数据太多引起的?无法执 ...
使用Spring jdbc template调用Sybase带有返回结果集的储存过程-要点 -
travellers:
有SVR6了,为什么很多还在使用SVR4呢?
什么是SVR4?我们为什么要选择SVR4? -
dotjar:
生活是多么美好阿!
老公日记
ECMAScript可以识别两种类型的对象,一种叫做Native Object属于语言范畴;一种叫做Host Object,由运行环境提供例如document对象,
Dom Node等
Native objects是一种松散的结构并且可以动态的增加属性(property),所有的属性都有一个名字和一个值,这个值可以是另一个对象的引用
或者是内建的数据类型(String, Number, Boolean, Null 或者 Undefined)
下面的这个简单的例子描述了一个javascript对象是如何设置一个属性的值和如何读取属性的值的。
赋值操作
一个对象的属性的创建非常简单,直接通过赋值操作就可以完成属性的创建。
一个名为testNumber的属性可以这样创建。
如果复制的属性名称已经存在那么不会再次创建这个属性,赋值操作仅仅是重新设置属性的值
js对象的原型(prototype)自己本身也可以是对象,也可以有属性(property),对于js对象的(prototype)的赋值操作跟普通对象属性的创建
没什么不同。
取值操作
在取值操作中property和prototype就不一样了,先看最简单的property取值操作。
prototype揭密
[color=blue]
但是所有的对象都可以有prototypes, prototypes自己也是对象,那么他也可以有prototypes,这样循环下去就形成了一个prototype链,
这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null)
创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype
我们在看下面的代码
objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype,
这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。
当一个取值操作发生时,objectRef 的整个prototype链就开始工作
objectRef这个对象的有一个属性叫做testString,那么这句代码会把testString的值赋给val
在objectRef这个对象里并没有testNumber这个属性,但是val却的到了值8,而不是undefine,这是因为解释器在没有在当前对象找到要找
的属性后,就会去检查这个对象的prototype,objectRef的prototype是MyObject1对象,这个对象有testNumber这个属性,所以val得到8这个值。
现在val是个function的引用,这个function是Object.prototype的property,由于MyObject1和MyObject2都没有定义toString这个property
所以Object.prototype返回。
最后val是undefined,因为MyObject1和MyObject2,还有Object都没有定义madeUpProperty这个property,所以得到的是undefine.
读操作会读取在obj自己和prototype 链上发现的第一个同名属性值
写操作会为obj对象本身创建一个同名属性(如果这个属性名不存在
这就意味着objectRef.testNumber = 3会在objectRef对象上创建一个property,名字是testNumber,当下一次在要读取testNumber时
propertype链就不会工作,仅仅会得到objectRef的property 3,而MyObject1的testNumber属性并不会被修改。下面的代码可以验证
[/color]
var i = i;
typeof i == 'number'
i.constructor == Number
而Number型对象是存在.toString()方法的,故i.toString()成立。
而对于instanceof的用法,我这里强调一下。
XXX instanceof YYY
这里的YYY都是Function型对象,
即typeof YYY == 'function',或YYY.constructor == Function。
比如:
var temp = function(){}
存在下面关系:
typeof new temp() == 'object'
new temp().constructor == temp
new temp() instanceof temp
new temp() instanceof Object
typeof temp == 'function'
temp.constructor == Function
temp instanceof Function
temp instanceof Object
总结:
typeof的结果只有可能是'number','string','boolean','function','object','undefined'
instanceof右边一定是Number,String,Boolean,Function,Object,自定义函数对象
.constructor的结果也只可能是Number,String,Boolean,Function,Object,自定义函数对象
且Number,String,Boolean,Function,Object,自定义函数对象,她们的.constructor都是Function,
typeof 她们 == 'function'。
Dom Node等
Native objects是一种松散的结构并且可以动态的增加属性(property),所有的属性都有一个名字和一个值,这个值可以是另一个对象的引用
或者是内建的数据类型(String, Number, Boolean, Null 或者 Undefined)
下面的这个简单的例子描述了一个javascript对象是如何设置一个属性的值和如何读取属性的值的。
赋值操作
一个对象的属性的创建非常简单,直接通过赋值操作就可以完成属性的创建。
var objectRef = new Object(); //create a generic javascript object.
一个名为testNumber的属性可以这样创建。
objectRef.testNumber = 5; /* - or:- */ objectRef["testNumber"] = 5;
如果复制的属性名称已经存在那么不会再次创建这个属性,赋值操作仅仅是重新设置属性的值
objectRef.testNumber = 8; /* - or:- */ objectRef["testNumber"] = 8;
js对象的原型(prototype)自己本身也可以是对象,也可以有属性(property),对于js对象的(prototype)的赋值操作跟普通对象属性的创建
没什么不同。
取值操作
在取值操作中property和prototype就不一样了,先看最简单的property取值操作。
/*为一个对象的属性赋值,如果这个对象没有这个属性,那么在赋值操作后,这个对象就有这个属性了 */ objectRef.testNumber = 8; /* 读出这个属性的值 */ var val = objectRef.testNumber; /* 现在val 就得到了刚才赋予objectRef的值8了*/
prototype揭密
[color=blue]
但是所有的对象都可以有prototypes, prototypes自己也是对象,那么他也可以有prototypes,这样循环下去就形成了一个prototype链,
这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null)
var objectRef = new Object(); //create a generic javascript object.
创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype
我们在看下面的代码
/* 构建MyObject1这个类型的构造函数 MyObject1 - type. */ function MyObject1(formalParameter){ /* 为者对象创建一个属性名字叫testNumber */ this.testNumber = formalParameter; } /* 构建MyObject2这个类型的构造函数 MyObject2 - type:- */ function MyObject2(formalParameter){ /* 为者对象创建一个属性名字叫testString*/ this.testString = formalParameter; } /* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/ MyObject2.prototype = new MyObject1( 8 ); /* 最后我们创建MyObject2类型的一个对象*/ var objectRef = new MyObject2( "String_Value" );
objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype,
这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。
当一个取值操作发生时,objectRef 的整个prototype链就开始工作
var val = objectRef.testString;
objectRef这个对象的有一个属性叫做testString,那么这句代码会把testString的值赋给val
var val = objectRef.testNumber;
在objectRef这个对象里并没有testNumber这个属性,但是val却的到了值8,而不是undefine,这是因为解释器在没有在当前对象找到要找
的属性后,就会去检查这个对象的prototype,objectRef的prototype是MyObject1对象,这个对象有testNumber这个属性,所以val得到8这个值。
var val = objectRef.toString;
现在val是个function的引用,这个function是Object.prototype的property,由于MyObject1和MyObject2都没有定义toString这个property
所以Object.prototype返回。
var val = objectRef.madeUpProperty;
最后val是undefined,因为MyObject1和MyObject2,还有Object都没有定义madeUpProperty这个property,所以得到的是undefine.
读操作会读取在obj自己和prototype 链上发现的第一个同名属性值
写操作会为obj对象本身创建一个同名属性(如果这个属性名不存在
这就意味着objectRef.testNumber = 3会在objectRef对象上创建一个property,名字是testNumber,当下一次在要读取testNumber时
propertype链就不会工作,仅仅会得到objectRef的property 3,而MyObject1的testNumber属性并不会被修改。下面的代码可以验证
/* 构建MyObject1这个类型的构造函数 MyObject1 - type. */ function MyObject1(formalParameter){ /* 为者对象创建一个属性名字叫testNumber */ this.testNumber = formalParameter; } /* 构建MyObject2这个类型的构造函数 MyObject2 - type:- */ function MyObject2(formalParameter){ /* 为者对象创建一个属性名字叫testString*/ this.testString = formalParameter; } /* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/ var obj1 = new MyObject1( 8 ); MyObject2.prototype = obj1; /* 最后我们创建MyObject2类型的一个对象*/ var objectRef = new MyObject2( "String_Value" ); alert(objectRef.testNumber); objectRef.testNumber = 5; alert(objectRef.testNumber); alert(obj1.testNumber);
[/color]
评论
8 楼
j2eeqk
2007-02-14
引用
请问val.toString()方法是从哪来的呢?
var i = i;
typeof i == 'number'
i.constructor == Number
而Number型对象是存在.toString()方法的,故i.toString()成立。
而对于instanceof的用法,我这里强调一下。
XXX instanceof YYY
这里的YYY都是Function型对象,
即typeof YYY == 'function',或YYY.constructor == Function。
比如:
var temp = function(){}
存在下面关系:
typeof new temp() == 'object'
new temp().constructor == temp
new temp() instanceof temp
new temp() instanceof Object
typeof temp == 'function'
temp.constructor == Function
temp instanceof Function
temp instanceof Object
总结:
typeof的结果只有可能是'number','string','boolean','function','object','undefined'
instanceof右边一定是Number,String,Boolean,Function,Object,自定义函数对象
.constructor的结果也只可能是Number,String,Boolean,Function,Object,自定义函数对象
且Number,String,Boolean,Function,Object,自定义函数对象,她们的.constructor都是Function,
typeof 她们 == 'function'。
7 楼
IvanLi
2007-02-12
toString是Object内建的方法
6 楼
jianfeng008cn
2007-02-12
var val=1;
alert(val.toString());
请问val.toString()方法是从哪来的呢?
typeof val==number
且
val instanceof Object===false
alert(val.toString());
请问val.toString()方法是从哪来的呢?
typeof val==number
且
val instanceof Object===false
5 楼
IvanLi
2007-02-12
理解了这个在去看prototype.js就会省很多力气,时刻记住两条
1:Object.prototype 是一个对象
2:prototype 链
1:Object.prototype 是一个对象
2:prototype 链
4 楼
y31
2007-02-11
言简意赅,行云流水,好!
3 楼
sp42
2007-02-10
欢迎这种科普教育
2 楼
j2eeqk
2007-02-09
LZ漂亮!Mark!这种好东西说出来大家彼此都舒服!痛快!
1 楼
jianfeng008cn
2007-02-09
说得很清爽!good work!
发表评论
-
use hibernate3-maven to export sql based on entity
2011-08-07 18:19 1398<plugin> <group ... -
uninstall mysql completely in my Mac X 10.6
2011-08-07 12:19 1195sudo rm /usr/local/mysql ... -
my vimrc
2011-05-14 11:02 1716copy from http://www.vi-improve ... -
使用HSQLDB来作EJB3 EntityBean到Unit Test要点
2010-01-20 17:17 2111add <property name=" ... -
user xrandr to change my desktop's resolution
2009-12-16 17:04 1681xrandr --newmode "1280x ... -
XSS的关键之列表
2009-10-11 17:20 1832//this field are used tp esc ... -
python查看方法帮助(from dive into python)
2009-09-30 11:31 2623def info(object, spanding=10, c ... -
selenium 测试ajax的关键
2009-01-20 18:26 42321: waitForCondition(contidtion, ... -
RichFaces 手记
2008-10-07 15:46 0安装,除了richfaces 下载包中的jar( " ... -
代码检查工具
2008-09-25 11:48 2559findBugs, PMD, CheckStyle find ... -
CI工具hudson
2008-09-24 17:04 3117CI工具除了hudson,还有很多,例如CruiseContr ... -
创建solaris package step by step
2008-09-24 11:27 1922原文地址:http://www.ibiblio.org/pub ... -
什么是SVR4?我们为什么要选择SVR4?
2008-09-23 14:13 4958http://www.lslnet.com/linux/f/d ... -
IPS 中的pkg command学习笔记
2008-09-22 17:18 1845pkg(1): 使用pkg(1)来创建一个镜像,安装,升级,管 ... -
On Board前的学习计划
2008-09-18 09:37 15191:在virtual box 上虚拟一个OpenSolaris ... -
YUI Grid CSS的优雅设计
2008-09-02 22:38 2816最近加入了一个GAE的项目cpedialog,该项目的前端布局 ... -
我很懒,但是懒人有懒办法
2008-08-18 17:06 1803今天要使用jackrabbit做个小东西,上apache一看, ... -
当XPath遇上NameSpace
2008-07-23 19:39 6564在jdk5.0中,已经包含了对Xpath的支持,可一通过下面的 ... -
ubuntu下安装ipmsg-飞鸽传书
2008-07-21 09:32 28821 先下载 源码 下载的是gnome2版本的源码 http ... -
sudo 执行时无密码(不安全)
2008-07-17 17:18 2214sudo visudo root ALL=(ALL) ...
相关推荐
本文将详细探讨JavaScript对象的属性(Property)与原型(Prototype)之间的关系,帮助读者深入理解这两种机制的工作原理及其应用场景。 #### 二、属性(Property) 属性是JavaScript对象中最基本的组成部分之一,它...
在 JavaScript 中,对象是语言的基本组成部分,对象可以拥有属性(Property)和原型(Prototype)。理解对象的 Property 和 Prototype 关系是 JavaScript 编程的基础。 Property 在 JavaScript 中,对象的 ...
对象反射是指一种能够让我们在不了解对象内部结构的情况下获取其属性和方法的技术。这在使用其他开发者提供的对象时特别有用,可以帮助我们快速了解对象的能力。 **示例:** ```javascript const myObject = { ...
尽管JavaScript本质上是一种基于原型的语言,但它也支持面向对象编程的一些特性,使得开发者能够编写出结构清晰、易于维护的代码。本文将详细介绍JavaScript中的面向对象编程概念和技术,包括类定义、对象创建、继承...
### JavaScript 类和对象的实现:深入探讨 #### 引言 JavaScript 作为一种脚本语言,其强大之处在于能够灵活地支持面向对象编程(OOP),尽管它最初设计时并非专门为此目的。JavaScript 的对象模型允许开发者以多种...
类和对象在JavaScript中是两个基本概念,它们之间的关系如下: 1. 类是抽象的,表示一类事物的共有特征和行为。 2. 对象是具体的,它是基于类的模板创建的实体,具有类所定义的属性和方法。 3. 对象是通过类(原型...
JavaScript对象是JS编程中的核心概念,它是一种数据结构,用于存储和组织数据。在JavaScript中,一切都是对象,包括基本类型如字符串、数字和布尔值,它们都有对应的包装对象。理解JavaScript对象模型对于深入学习和...
1. 对象定义:JavaScript对象是一种数据结构,它由键值对组成,键可以是字符串或符号,值可以是任何类型的数据。 2. 创建对象:通过字面量语法`{key1: value1, key2: value2}`或构造函数`new Object()`创建。 3. ...
在JavaScript中,对象property的读取和写入是编程中非常基础且重要的操作。下面将详细解释这些概念和相关的规则。 ### 对象property的读取 JavaScript提供了两种基本的访问对象property的方法:点号操作符(`. `)...
- **`Object.extend`**:该方法用于将源对象的所有属性复制到目标对象中,是实现继承的一种方式。例如,`var c = a.extend(b);` 之后,`c` 同时拥有 `a` 和 `b` 的所有属性,但 `c instanceof ObjectB` 的结果为 `...
JavaScript是一种动态类型的脚本语言,尤其在面向对象编程方面,它的实现方式与传统的面向对象语言如Java或C++有所不同。本文将深入浅出地讲解JavaScript中的面向对象技术基础,包括对象、数组、函数、类、构造函数...
面向对象编程(OOP)是一种编程范式,JavaScript 虽然不是传统的面向对象语言,但仍然支持面向对象编程。 ##### 类与对象的关系 在 JavaScript 中,通常使用构造函数来创建对象。构造函数类似于其他语言中的类。 ```...
在JavaScript中,面向对象编程是一种重要的编程范式,它允许我们通过类和对象来组织和管理代码。在JavaScript中,面向对象主要基于以下三个核心概念:构造函数、原型和实例。 首先,我们要理解如何在JavaScript中...
JavaScript对象是前端开发中至关重要的概念,它是JavaScript语言的核心特性之一。对象本质上是属性和方法的集合,可以用来表示现实世界中的实体或者抽象概念。在JavaScript中,对象的创建、属性访问、方法定义以及...
在JavaScript中,`prototype`是一个核心概念,它涉及到面向对象编程中的类和实例之间的关系。`prototype`对象允许我们为类(或构造函数)定义共享的方法和属性,这些方法和属性可以在所有实例中访问,而无需为每个...