javascript笔记:深入分析javascript里对象的创建(中)

深入分析javascript里对象的创建这个小系列是我整个博客里最受欢迎的文章,有博友催我把下篇写完,昨天和今天整理资料发现一篇文章还真讲不完我下半部分的内容,所以把本来打算写的下篇分成两部分了。

  本主题的上篇里我讲到了三种对象创建的方式,最后通过类比java面向对象的思想反过来理解javascript对象的创建。如果根据标题的核心对象的创建,我所阐述的问题其实已经讲完,但是我写完上篇时候总觉得欠缺点啥,欠缺我的标题里面的深入分析二字。小小的创建一个javascript对象它所包含的技术的延伸面是极其宽泛的,到了实际开发时候没有一定发散的知识的积累我们想还会碰到难以理解的问题,中篇和下篇我想从我前一篇讲到的知识拓展开这个问题。

  1.类的属性和方法的另一种理解

  上篇里面我写到一句话:“一.属于类的属性和方法:用对象初始化的方式都可以当做是属于类的属性和方法,这种定义在jQuery里面大量运用。”

  大家知道在java里面类可以具有静态属性和方法,无需实例化该类的对象,就可以访问这些属性和方法,但是javascript里面是不是只有通过对象初始化方式才会模拟出这样的特点了?其实不然,在编程语言里,类的方法和属性比较标准的叫法是:静态作用域定义的属性和方法任何时候都能从同一个位置访问。其实严格意义上说javascript是没有静态作用域,对象初始化可以产生这样的效果,但是它太不直观了,前面的博文里我讲到javascript语言设计时候省略的类这个定义,而是把类的定义赋予到了构造函数里面,那么我们可以这样思考,要想让javascript语言里有属于类的属性和方法,最佳的展现形式就是让构造函数本身具有属性和方法,大家看下面代码:

 

复制代码
function JsObj()
{
this.sayHello = function(){
console.log('Hello World!!!');
}

}

JsObj.whosay = function(){
console.log('sharpxiajun say Hello World!!!');
}

JsObj.whosay();
var obj = new JsObj();//sharpxiajun say Hello World!!!
obj.sayHello();//Hello World!!!
复制代码

  这种写法体现类的静态属性和方法特点会更加清晰些,前不久有人告诉我javascript里面的面向对象的做法现在已经成为了一种实现面向对象的标准,有些新语言现在就借鉴javascript来设计自己的面向对象的机制,但是我另可不去相信这个说法,我还是愿意把java的方式作为面向对象的标准方式,而javascript只是用模拟方式来实现,如果真让我把javascript面向对象做为一个新标准来理解,惯性的思维可能很难让我对javascript面向对象的做法有更加清晰的认识。如果说上面代码所运用的原理无非是javascript里面函数就是对象,同样可以为其赋值或者授予方法。这个问题很简单,也很好理解,我这里拿出这段代码是想告诉大家,我在读一些经典框架源码时候,有些设计思想就是运用了这种写法,但是我却没有把他们当作静态变量来理解,导致有些代码没有读懂。

  2.关于this指针的问题

  这是javascript最最最重要的一个概念,它的用法是掌握javascript精髓的关键。我们先看看下面这句话很关键,它道出了this用法的精髓:

  关键字this的用法:它用在对象的方法中,this总是指向调用该方法的对象。

  这句话道出了this是存在于对象的方法,里面包含两个内容:对象和方法,方法属于对象,示例格式就是:

 

复制代码
var obj = {};//或者var obj = new Object();二者等价
obj.nation = 'China';
obj.say1 = function()
{
console.log(obj.nation);
}
obj.say2 = function()
{
console.log(this.nation);
}

obj.say1();//China
obj.say2();//China
复制代码

  结果一样,这个正好体现了this使用在对象方法中,this总是指向调用该方法的对象。这是对this用法的标准定义,但是真的把这个概念理解透还真的下功夫,下面我抛开这个定义,列举我所知道的this的用法。

  用法一:在函数中的使用

 

function JsObj()
{
this.nation = 'China';
console.log(this.nation);
}
JsObj();//China

  那么这个this指向的是JsObj函数吗?回答是NO,this指向的是window,看下面代码:

 

复制代码
function JsObj()
{
this.nation = 'China';
console.log(this.nation);
}
JsObj();//China

console.log(nation);//China
console.log(window.nation);//China
console.log(this.nation);//China
复制代码

  看到效果了吧,指向的是window,我想有些童鞋可能不太理解为什么,没关系,这个疑问会引出我下一个小节要讲的内容。

  用法二:作为对象方法的调用

  这个用法和我最开始讲this指针的用法类似,代码如下:

 

复制代码
function say()
{
console.log(this.nation);
}

var obj = {};
obj.nation = 'China';
obj.objSay = say;
obj.objSay();//China
复制代码

  用法三:作为构造函数的调用

  说道javascript构造函数,我就要反复再强调一个基础知识:在javascript里的构造函数包含了类的特性。下面看我写的代码:

 

function JsObj()
{
this.nation = 'China';
}
var obj = new JsObj();
console.log(obj.nation);//China

  这个nation绝对不属于window了,大家信不信了?我们可以测试一下:

 

复制代码
var nation = 'USA';
function JsObj()
{
this.nation = 'China';
}
var obj = new JsObj();
console.log(obj.nation);//China
console.log(nation);//USA
复制代码

  用法四:apply调用时候的this

  apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。测试代码如下:

 

复制代码
var nation = 'USA';
function say()
{
console.log(this.nation);
}
var obj = {};
obj.nation = 'China';
obj.objSay = say;
obj.objSay.apply();//USA
obj.objSay.apply(obj);//China
复制代码

  apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为USA,证明this指的是全局对象。apply传入obj对象,this就指向了对象obj了,运行的结果是China。

  3.执行环境及作用域

  我在上面总结javascript里this用法时候提出了一个问题,为什么this指向了window,解释这个问题就会牵涉出javascript里面有一个非常重要的概念执行环境及作用域

  首先说道的是执行环境,什么是执行环境呢?在javascript里面执行环境分为两类,一类是全局环境,一类是局部环境,整个页面里被共享的方法和属性就是在全局环境,相对于全局环境,函数{}号里的执行环境就是局部环境,执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都定义了一个与之相关的变量对象,环境中定义的所有变量和函数都保存在这个对象里,虽然我们自己编写的代码无法访问这个对象,但解析器在处理数据时候后台会使用到它

  全局执行环境另一种说法是最外围的一个执行环境,在web浏览器的范围中(actionscript也是施行了ECMAScript标准,它的全局范围就和javascript的全局范围不同),全局执行环境被认为是window对象,因此全局变量和函数都是作为window对象的方法和属性来创建的,全局执行环境知道应用程序退出比如关闭网页或浏览器才会被销毁。而局部环境则是以函数对象作为关联对象。

  javascript语言规定了全局执行环境和局部执行环境的概念,这就产生了一个极其重要的应用:作用域链。当代码在一个环境里面被执行的时候会创建变量的对象构成的作用域链,它的用途是保证对执行环境有权访问所有变量和函数的有序访问。作用域链的前端始终是当前执行代码所在的环境的变量对象。如果这个环境是函数,则将其活动对象作为变量的对象,活动对象在最开始时只包含一个变量,就是arguments对象,arguments在全局环境中是不存在的,作用域链的下一个对象来自包含前一个对象的外部环境,而再下一个变量对象则来自下一个包含环境,如此类推,一直延续到全局环境,全局环境永远是作用域链最后一个对象。

  呵呵,看这个解释是不是有点晕啊,我想换个角度思考可能好理解点,在javascript里,所有的属性和方法都是属于某一个对象的,其实在javascript里面,所有方法或属性的调用都是obj.method(),obj.name样式,如果程序代码里调用属性或方法时候找不到这个调用对象,javascript解析器就会往函数作用域的上层作用域里找,直到window全局环境,实在找不到的就默认授予给window对象。

  好了,今天内容就写到这么多吧,真没想到javascript一个个看起来简单的对象创建能延伸出这么多知识,回味下这种点到面的研究方法还是蛮不错的,最近做java太多(我最近想开起一个新系列,我一直想做的系列android,不过有人跟我说一个人精力有限,我还是先把没写完的东西写完),写javascrip的激情有点不够了,真希望有一个全职做前端的环境,不过java也是很有趣的,最近和博友交流后我越加有动力把三套javaEE框架写完,给自己打打气,加油了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答1: JavaScript对象编程是指使用JavaScript语言创建和操作对象的过程。在JavaScript对象是一种复合数据类型,可以包含属性和方法。对象可以通过字面量、构造函数、原型等方式创建。通过对象编程,可以实现面向对象编程的思想,使代码更加模块化、可维护和可扩展。在JavaScript对象是非常重要的概念,掌握对象编程是成为一名优秀的JavaScript开发者的必备技能之一。 ### 回答2: JavaScript是一种流行的编程语言,其面向对象编程(OOP)是其的重要组成部分。对象JavaScript编程最重要的概念之一,它是一种数据类型,通过对象可以轻松地组织和管理数据。JS对象包含了一组属性和方法,可以用来描述某个对象的性质和行为。 在JavaScript对象是动态创建的。创建对象的方法有很多,其最简单的就是使用字面量,例如: var person = { name: 'Tom', age: 20, gender: 'male', sayHi: function() { console.log('Hi, my name is ' + this.name + ',I am ' + this.age + ' years old.') } }; 上面的代码定义了一个名为person的对象,该对象具有属性name、age、gender和方法sayHi。使用字面量创建对象的好处是,可以轻松地在代码定义对象,而无需使用专门的构造函数。 当然,也可以使用构造函数来创建对象,例如: function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; this.sayHi = function() { console.log('Hi, my name is ' + this.name + ',I am ' + this.age + ' years old.') } }; var person = new Person('Tom', 20, 'male'); 上面的代码定义了一个名为Person的构造函数,在创建对象时使用了new关键字来调用该构造函数,返回一个新的person对象。这个对象包含了属性name、age、gender和方法sayHi。 在JavaScript对象是可以嵌套的。可以在对象嵌套其他对象,也可以在对象嵌套函数,这些函数就是对象的方法。通过对象的嵌套,可以更好地管理数据,使程序更加规范和易于维护。 总之,JavaScript对象编程是一种强大且灵活的编程方式,通过对象可以轻松地组织和管理数据,从而实现更好的开发效率和代码质量。由于JavaScript的广泛应用,对于对象编程的掌握将有助于开发者更好地掌握这门语言。 ### 回答3: 在JavaScript对象是一种基础数据类型,也是语法的重要组成部分。对象是由若干属性构成的,每个属性都是键值对的形式,其键是字符串类型,值可以是任意的JavaScript数据类型,包括对象。通过定义对象的属性和方法,我们可以在JavaScript创建功能强大的程序。 JavaScript对象编程有以下几个重要概念: 1. 对象字面量:使用“{}”来定义对象,字符:“:”分割键与值,“,”分割不同键值对。如:var obj = {name: "小明", age: 18}; 2. 访问对象属性:使用“.”操作符访问对象属性。如:obj.name 3. 新增属性:使用“.”或“[]”,如:obj.height = 180; 或 obj['sex'] = 'male'; 4. 删除属性:使用“delete”关键字,如:delete obj.age; 5. 遍历对象属性:使用“for...in...”语句遍历对象属性,如: for(var key in obj) { console.log(key + ": " + obj[key]); } 6. 面向对象编程JavaScript也可以实现面向对象编程定义一个构造函数,然后使用“new”关键字创建对象实例,如: function Person(name, age) { this.name = name; this.age = age; this.sayHello = function () { console.log("Hello, my name is " + this.name + ", I'm " + this.age + " years old."); } } var p = new Person('小明', 18); p.sayHello(); // 输出:Hello, my name is 小明, I'm 18 years old. JavaScript对象编程是非常灵活的,我们可以根据需要动态地定义、操作对象,同时结合面向对象编程,使得JavaScript的代码结构更加清晰有序。掌握好JavaScript对象编程的技巧,可以让我们开发出更高效、更具有扩展性的项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值