本文目录一览:
- 1、求助,关于js面向对象成员方法的
- 2、JS类中,静态方法怎么获取实例
- 3、JS怎么在类实例的事件处理函数中访问类实例的成员
- 4、javascript的对象和变量之间的区分
- 5、js里为什么实例化的对象没有prototype属性??
求助,关于js面向对象成员方法的
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中,就可以简单地使用逗somebooks.book[0].name地来获取逗三国演义地这个值。
我们不但可以将一个JSON字符串转化为对象,反过来将一个对象逗编译地为一个JSON字符串,以方便JavaScript中的对象的传输。例如:
复制代码 代码如下:
var Animals = new Object();
Animals.name = "dog";
Animals.sex = "Male";
Animals.age = "2";
Animals对象无法被序列化传输,将Animals对象转化为JSON字符串,也就是逗{name:"dog",sex:"Male",age:"2"}地。这样,把该JSON字符串作为HTTP请求的一个参数传递,从而达到序列化传输Animals对象的目的。
(ii)JSON通过字符串形式来表达JavaScript的对象。如:
复制代码 代码如下:
var myObject = {nickname:"my girlfried",name:"big
pig"};
JSON
实际上充当了一种在JavaScript对象和字符串之间实现相互转换的协议。由于JSON的逗外表地可以看成但村的字符串,因此JSON在
JavaScript的对象传输方面可以起到一定的作用。例如把对象strObject转换成字符串后进行传输,在达到目的地后通过eval方法将其还原
成对象:
复制代码 代码如下:
function test (o)
{
alert (o.name)
}
var strObject = '{nickname:"my girlfriend",name:"big pig"}';
test (eval_r("(" + strObject + ")"));
三、自定义对象构造
创建高级对象构造有两种方式:使用逗this地关键字构造、使用原型prototype构造。如:
复制代码 代码如下:
//使用this关键字定义构造的上下文属性
function Girl()
{
this.name = "big pig";
this.age = 20;
this.standing;
this.bust;
this.waist;
this.hip;
}
//使用prototype
function Girl(){}
Girl.prototype.name = "big pig";
Girl.prototype.age = 20;
Girl.prototype.standing;
Girl.prototype.bust;
Girl.prototype.waist;
Girl.prototype.hip;
alert(new Girl().name);
上例中的两种定义在本质上没有区别,都是定义逗Girl地对象的属性信息。逗this地与逗prototype地的区别主要在于属性访问的顺序。如:
复制代码 代码如下:
function Test()
{
this.text = function()
{
alert("defined by this");
}
}
Test.prototype.test = function()
{
alert("defined by prototype");
}
var _o = new Test();
_o.test();//输出逗defined by this地
当访问对象的属性或者方法是,将按照搜索原型链prototype
chain的规则进行。首先查找自身的静态属性、方法,继而查找构造上下文的可访问属性、方法,最后查找构造的原型链。
逗this地
与逗prototype地定义的另一个不同点是属性的占用空间不同。使用逗this地关键字,示例初始化时为每个实例开辟构造方法所包含的所有属性、方法
所需的空间,而使用逗prototype地定义,由于逗prototype地实际上是指向父级的一种引用,仅仅是个数据的副本,因此在初始化及存储上都比
逗this地节约资源。
JS类中,静态方法怎么获取实例
1,静态的成员直接类名点成员名就能访问。
2,实例成员你需要先创建新的实例!然后实例名点成员名!
JS怎么在类实例的事件处理函数中访问类实例的成员
在事件处理函数之外定义一个变量 var that = this;
然后在事件处理函数之内用 that.成员名 访问。
如果支持ES6的话,直接使用箭头函数可以直接用 this访问。
javascript的对象和变量之间的区分
0, JavaScript的变量有几种类型: number, string, boolean, function, object, 对象就是变量的一种类型.
1,var request = createRequest();
我可以吧request当作一个变量,由createRequest方法来赋值;
这个说法有歧义, 不是由方法对变量赋值, 而是使用createRequest的返回值为变量赋值.
2, 我也可以把它当作一个object,于是request.xxx可以访问createRequest方法里面的xxx。
这个理解是错的, 从外部不能访问到方法内部定义的变量. 有一种特殊的情况:
function closure(){
var a = 1;
return function() {
return a++;
}
}
var fn = closure();
alert(fn()); //1;
alert(fn()); //2; 函数内部的变量被改变了
这个是JavaScript的闭包机制, 可以在方法外部修改方法的内部变更量. 类似于.Net的委托机制(Java的Callback); 并且这个内部变量的行为类似强制类型语言中的实例私有成员, 参考下面的代码:
//接上面的代码
var fn2 = closure();
alert(fn2()); //1, 创建了新的闭包
alert(fn()); //3, 原有闭包并未释放,
fn = null; //将对闭包内部变量的引用释放(将fn赋其它值也一样, fn = 1;), 则该闭包将会被gc回收
3, 对象, JavaScript对象一定是使用new关键字创建.
var a = {}; //简化写法等价于 var a = new Object();
var b = []; //简化写法等价于 var a = new Array();
4, 实例, javascript不是面向对象的语言, 但是对象有默认的constructor属性, 引用创建对象的function(可以理解为某类型的实例). 但是, 因为javascript是弱类型动态语言, 可以动态修改对象的结构或使用其它类型的引用为变量赋值, 所以并不能在语言层面确保对象的封装, 参考下面的代码:
function class(){
this.a = 1;
this.b = 'a';
}
function somethingElse() {
return 1;
}
//创建3个class的实例
var a = new class();
var b = new class();
var c = new class();
//此时 a.constructor === b.constructor === c.constructor === class;
a.constructor = somethingElse; //覆盖constructor属性, 这样a就和class没有任何关联了, 虽然有一个instanceof二元操作符, 但是其实现是比较prototype, 本例中都没有指定prototype(默认{}), 所以instanceof是无效的, a instanceof class == true, a instanceof somethingElse == true, a instanceof Object == true,
b = new somethingElse(); //这时b就变成somethingElse的实例了(b.constructor === somethingElse), 但是somethingElse方法没有为实例添加任何成员, 所以b = {};
delete c.b; //删除对象的成员, c = {a: 1}, 这样虽然c.constructor === class(还是class的实例), 但是与其它由class创建的实例外观就不同了.
js里为什么实例化的对象没有prototype属性??
自从有了Ajax这个概念,JavaScript作为Ajax的利器,其作用一路飙升。JavaScript最基本的使用,以及语法、浏览器对象等等东东在这里就不累赘了。把主要篇幅放在如何实现JavaScript的面向对象编程方面。 1. 用JavaScript实现类 JavaScritpt没有专门的机制实现类,这里是借助它的函数允许嵌套的机制来实现类的。一个函数可以包含变量,又可以包含其它函数,这样,变量可以作为属性,内部的函数就可以作为成员方法了。因此外层函数本身就可以作为一个类了。如下:function myClass()这里 myClass就是一个类。其实可以把它看成类的构造函数。至于非构造函数的部分,以后会详细描述。 2. 如何获得一个类的实例 实现了类就应该可以获得类的实例,JavaScript提供了一个方法可以获得对象实例。即 new操作符。其实JavaScript中,类和函数是同一个概念,当用new操作一个函数时就返回一个对象。如下:var obj1 = new myClass(); 3. 对象的成员的引用 在JavaScript中引用一个类的属性或方法的方法有以下三种。 1 点号操作符 这是一种最普遍的引用方式,就不累赘。即如下形式:对象名.属性名;对象名.方法名; 2 方括号引用 JavaScript中允许用方括号引用对象的成员。如下:对象名["属性名"];对象名["方法名"]; 这里方括号内是代表属性或方法名的字符串,不一定是字符串常量。也可以使用变量。这样就可以使用变量传递属性或方法名。为编程带来了方便。在某些情况下,代码中不能确定要调用那个属性或方法时,就可以采用这种方式。否则,如果使用点号操作符,还需要使用条件判断来调用属性或方法。 另外,使用方括号引用的属性和方法名还可以以数字开头,或者出现空格,而使用点号引用的属性和方法名则遵循标示符的规则。但一般不提倡使用非标示符的命名方法。 3 使用eval函数 如果不希望使用变量传递变量或方法名,又不想使用条件判断,那么eval函数是一个好的选择。eval接收一个字符串类型的参数,然后将这个字符串作为代码在上下文中执行,返回执行的结果。这里正是利用了eval的这一功能。如下:alert(eval("对象名." + element.value)); 4. 对对象属性,方法的添加、修改和删除操作 JavaScript中,在生成对象之后还可以为对象动态添加、修改和删除属性和方法,这与其它面向对象的语言是不同的。 nbsp
如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快! vae.la