js面向对象的几种方式

js面向对象的几种方式,第1张

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内方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9639799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存