JavaScript中对象的创建有以下几种方式:
(1)使用内置对象
(2)使用JSON符号
(3)自定义对象构造
一、使用内置对象
JavaScript可用的内置对象可分为两种:
1,JavaScript语言原生对象(语言级对象),如String、Object、Function等;
2,JavaScript运行期的宿主对象(环境宿主级对象),如window、document、body等。
我们所说的使用内置对象,是指通过JavaScript语言原生对象的构造方法,实例化出一个新的对象。如:
复制代码 代码如下:
var str = new String("实例初始化String");
var str1 = "直接赋值的String";
var func = new Function("x","alert(x)");//示例初始化func
var o = new Object();//示例初始化一个Object
二、使用JSON符号
(i)何谓JSON
JSON (JavaScript Object
Notation)即JavaScript对象命名,是一种轻量级的数据交换格式,易于阅读和编写,同时也易于及其解析和生成。它基于
《JavaScript Programming Language, Standard ECMA-262 3rd Edition -
December 1999》的一个子集。JSON是完全独立于语言的文本格式,因此成为数据交换的理想格式。
JSON作为
JavaScript的一个自己,同时ActionScript、C、C#、ColdFusion、E、Java、JavaScript、ML、
ObjectiveCAML、Perl、PHP、Python、Rebol、Ruby、Lua等一系列的语言都提供支持,使得JSON成为Ajax开发的
首选方案。
JSON有两种构建方式,一种是采用简单的“键/值对”的集合,在不同的语言中被理解为对象、记录、结构、字典、哈希表、有键列表,或者关联数组等,另一种采用有序的值列表,大部分语言把它理解为数组。
常用的创建方式是第一种,即采用“键/值对”集合的形式。在这种形式下,一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号),“
‘键/值' 对”之间使用“,”(逗号)分隔。
JSON具有以下特点:(1)简单格式化的数据交换;(2)易于人们的读写习惯;(3)易于机器的分析和运行。
在JavaScript中,JSON被理解为对象。通过字符串形式的JSON,数据可以很方便地解析成JavaScript独享,并进行数据的读取传递。通过JSON,在一定程度上客服了JavaScript对象无法作为参数系列化传递的问题。
1,简单的JSON
{name:"刘德华",age:"25",sex:"男"}
2,JSON值的类型
JSON的值可以是简单的数据类型,例如数字、浮点、字符等,也可以是数组及对象。例如以数组作为member键值的JSON:
{member:[{name:"刘德华"},{name:"郭富城"},{name:"张学友"},{name:"黎明"}]}
{
book:[{name:"三国演义"},{name:"西游记"},{name:"水浒传"},{name:"红楼梦"}],
author:[{name:"罗贯中"},{name:"吴承恩"},{name:"施耐安",{name:"曹雪芹"}}]
}
3,在JavaScript中使用JSON
JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或者工具包,JavaScript默认将JSON当做一个对象处理。
将对象传递给一个变量,例如:
复制代码 代码如下:
var somebooks = {
book:[{name:"三国演义"},{name:"西游记"},{name:"水浒传"},{name:"红楼梦"}],
author:[{name:"罗贯中"},{name:"吴承恩"},{name:"施耐安",{name:"曹雪芹"}}]
}
JSON的每个“键”相当于对象的属性,例如访问book中的第一个条目,在JavaScript中,就可以简单地使用“somebooksbook[0]name”来获取“三国演义”这个值。
我们不但可以将一个JSON字符串转化为对象,反过来将一个对象“编译”为一个JSON字符串,以方便JavaScript中的对象的传输。例如:
复制代码 代码如下:
var Animals = new Object();
Animalsname = "dog";
Animalssex = "Male";
Animalsage = "2";
Animals对象无法被序列化传输,将Animals对象转化为JSON字符串,也就是“{name:"dog",sex:"Male",age:"2"}”。这样,把该JSON字符串作为>
题主应该可以理解第一种调用方式得到的结果,a、b、c都被赋值为test函数的返回结果,也就是一个函数。
问题出在第二种调用方式上,而造成两次c结果不一致的原因显然就是楼主是用了不同的调用顺序。先给b赋值,再给c赋值,结果没问题,但先给c赋值,再给b赋值,c的结果变成了10。
这个问题很有意思,它需要结果题主的问题2来解释。
在解释之前,请题主将var c = new test()换成var d = new test(),楼主就会发现,两种方式调用,d的值是不会有变化的,都是函数。
那么再请题主将第二种调用方式改成如下:
var a = new test();dwn(a);
var c = new test();
dwn(c);
var b = test();
dwn(b);
题主就会发现c的值还是函数而不是10。
那么题主自己找找,这个10是不是很眼熟?没错,它就是test函数thisc的值。
为什么c会被赋值为thisc的值?那问题就是this是谁。如果你在test函数中加上dwn(this),结果就会很清楚,this就是window,也就是说,如果一个构造函数返回了对象,那么它的返回值会覆盖这个对象,就跟直接调用这个函数一样,显然这个时候函数中的this就变成 了全局的window。
再回头看题主的问题,先是给a赋值new test(),a得到的是一个函数,没问题;再给c赋值new test(),这一步需要关注thisc这行代码,它首先给全局的c赋值为10,而这个全局的c实际上就var c中的c。如果就此结束,打印c应该是10,但接下来返回了一个函数,c在被赋值为10后立即又被赋值一个函数,所以这个c是一个函数;最后是给b赋值,也需要关注这个thisc。首先它给windowc赋值为10,但windowc原来的值是什么?对,是一个函数,可是这里又给这个c赋值了10,所以最后打印出来的c是10。接着给b赋值一个函数,所以b是一个函数。
两次结果不一致,是因为在给b赋值的时候,thisc = 10覆盖之前的c等于一个函数的结果。所以,如果你把var c换成var d,就不会有这个问题,因为test里是thisc,而不是thisd。
取消
首页
编程
手机
软件
硬件
安卓
苹果
手游
教程
平面
服务器
首页 > 网络编程 > JavaScript > javascript技巧 > js构造函数constructor和原型prototype
js构造函数constructor和原型prototype原理与用法实例分析
发布时间:2020-03-02 09:43:39 作者:叶落森
本文实例讲述了js构造函数constructor和原型prototype原理与用法。分享给大家供大家参考,具体如下:
所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
所有函数拥有prototype属性(显式原型)(仅限函数)
原型对象:拥有prototype属性的对象,在定义函数时就被创建
__proto__, prototype和constructor
下面这三个属性的定义非常重要,始终贯穿在原型中。
prototype:此属性只有构造函数才有,它指向的是当前构造函数的原型对象。
__proto__:此属性是任何对象在创建时都会有的一个属性,它指向了产生当前对象的构造函数的原型对象,由于并非标准规定属性,不要随便去更改这个属性的值,以免破坏原型链,但是可以借助这个属性来学习,所谓的原型链就是由__proto__连接而成的链。
constructor:此属性只有原型对象才有,它默认指回prototype属性所在的构造函数。
构造函数的特点:
a:构造函数的首字母必须大写,用来区分于普通函数
b:内部使用的this对象,来指向即将要生成的实例对象
c:使用New来生成实例对象
function定义的对象有一个prototype属性,使用new生成的对象就没有这个prototype属性(Person是一个对象)
Person是一个对象,它有一个prototype的原型属性(因为所有的对象都一prototype原型!)prototype属性有自己的prototype对象,而pototype对象肯定也有自己的construct(构造)属性,construct属性有自己的constructor(构造函数)对象,神奇的事情要发生了,这最后一个
以上就是关于js面向对象的几种方式全部的内容,包括:js面向对象的几种方式、关于Js构造函数的问题。求助!、js构造函数中如何调用prototype内方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)