导航:首页 > 编程知识 > 怎么理解js是面向对象编程

怎么理解js是面向对象编程

发布时间:2023-03-19 18:15:06

『壹』 javascript是基于对象的还是面向对象的

我忘了在哪里看到过这样一个比喻:
基于对象,就是一个工程师建了一栋房子,然后其它的工程师按照这个房子的样子去建造其它的房子
面向对象,就是一个工程师再图纸上设计出一栋房子的样子,然后其它工程师按照这个图纸的设计去建造房子
也就是说:
基于对象是先有一个具体的对象,然后在这个对象的基础上创建新的对象
面向对象就是先有一个抽象的对象描述,然后以此为蓝本构建具体对象

『贰』 js面向对象怎么理解

首先你的理解面向过程:加入把一件东西放到一个箱子手枣晌里,面向过程岩漏就是第一部打开箱子,然后把东西放进去,然后关闭箱子:
面向对象:就是把箱子看成一个对象,这个对象有属性比如说长宽高尺寸毕锋这些,他还有一个功能就是装东西.装东西这个就I相当于一个函数

『叁』 JS 面向对象

为了能够清楚的解释这一切,我先从对象讲起。从其他面向对象语言(如Java)而来的人可能认为在JS里的对象也是由类来实例化出来的,并且是由属性和方法组成的。
实际上在JS里并不是如你所想(我开始是这么想的)那样,对象或直接称为object,实际上只是一些映射对的集合,像Map,字典等概念。JS里有大概7种类型(加上Symbol),数字、字符串、null、undefined、布尔、Symbol、对象。除对象以外的其他类型属于原始类型,就是说它们比较单纯,包含的东西比较少,基本上就是字面量所表示的那些(像C语言中的一些类型,就是占那么多空间,没有其他的东西)。object基本上是一些键值对的集合,属于引用类型,即是有一个名字去指向它来供别人使用的,就好像比较重的东西你拿不动,而只是拿了张记录东西所在地的纸条。所以当A对象里嵌套了B对象,仅表示A里面有一个引用指向了B,并不是真正把B包含在A里面,虽然看起来是这样(尤其是从对象的字面量上来看),所以才会有所谓的深拷贝与浅拷贝。
有句话叫“JavaScript里一切皆对象”,是因为在很多情况下原始类型会被自动的转为对象,而函数实际上也是对象,这样这句话看起来就很有道理了。
说明对象的本质是为了正确地认识对象,因为这关系到后面的理解。

『肆』 如何理解Javascript中类和对象这两个概念

在说这个话题之前,我想先说几句题外话:最近偶然碰到有朋友问我“hoisting”的问题。即在js里所有变量的声明都是置顶的,而赋值则是在之后发生的。可以看看这个例子:
var a = 'global';
(function () {
alert(a);
var a = 'local';
})();

大家第一眼看到这个例子觉得输出结果是什么?‘global’?还是‘local’?其实都不是,输出的是undefined,不用迷惑,我的题外话就是为了讲这个东西的。
其实很简单,看一看JavaScript运行机制就会明白。我们可以把这种现象看做“预声明”。但是如果稍微深究一下,会明白得更透彻。
这里其实涉及到对象属性绑定机制。因为所有JavaScript函数都是一个对象。在函数里声明的变量可以看做这个对象的“类似属性”。对象属性的绑定在语言里是有分“早绑定”和“晚绑定”之分的。

【早绑定】
是指在实例化对象之前定义其属性和方法。解析程序时可以提前转换为机器代码。通常的强类型语言如C++,java等,都是早绑定机制的。而JavaScript不是强类型语言。它使用的是“晚绑定”机制。
【晚绑定】
是指在程序运行前,无需检查对象类型,只要检查对象是否支持特性和方法即可。可以在绑定前对对象执行大量操作而不受任何惩罚。
上面代码出现的“预声明”现象,我们大可用“晚绑定”机制来解释。在函数的作用域中,所有变量都是“晚绑定”的。 即声明是顶级的。所以上面的代码和下面的一致:

var a = 'global';
(function () {
var a;
alert(a);
a = 'local';
})();

在alert(a)之前只对a作了声明而没有赋值。所以结果可想而知。

<!-- 题外话到此结束 -->
RT:本文要说的是,在JavaScript里,我所知道的几种定义类和对象的方式:<! -- 声明:以下内容大部分来自《JavaScript高级程序设计》,只是个人叙述方式不同而已 -- >
【直接量方式】
使用直接量构建对象是最基础的方式,但也有很多弊端。
var Obj = new Object;
Obj.name = 'sun';
Obj.showName = function() {
alert('this.name');
}

我们构建了一个对象Obj,它有一个属性name,一个方法showName。但是如果我们要再构建一个类似的对象呢?难道还要再重复一遍?
NO!,我们可以用一个返回特定类型对象的工厂函数来实现。就像工厂一样,流水线的输出我们要的特定类型结果。
【工厂方式】

function createObj(name) {
var tempObj = new Object;
tempObj.name = name;
tempObj.showName = function () {
alert(this.name);
};
return tempObj;
}
var obj1 = createObj('obj_one');
var obj2 = createObj('obj_two');

这种工厂函数很多人是不把他当做构建对象的一种形式的。一部分原因是语义:即它并不像使用了运算符new来构建的那么正规。还有一个更大的原因,是因为这个工厂每次产出一个对象都会创建一个新函数showName(),即每个对象拥有不同的版本,但实际上他们共享的是同一个函数。
有些人把showName在工厂函数外定义,然后通过属性指向该方法,可以避开这个问题:
代码

可惜的是,这种方式让showName()这个函数看起来不像对象的一个方法。
【构造函数方式】
这种方式是为了解决上面工厂函数的第一个问题,即没有new运算符的问题。可是第二个问题它依然不能解决。我们来看看。

function Obj(name) {
this.name = name;
this.showName = function () {
alert(this.name);
}
}
var obj1 = new Obj('obj_one');
var obj2 = new Obj('obj_two');

它的好处是不用在构造函数内新建一个对象了,因为new运算符执行的时候会自动创建一个对象,并且只有通过this才能访问这个对象。所以我们可以直接通过this来对这个对象进行赋值。而且不用再return,因为this指向默认为构造函数的返回值。
同时,用了new关键字来创建我们想要的对象是不是感觉更“正式”了。
可惜,它仍然不能解决会重复生成方法函数的问题,这个情况和工厂函数一样。

【原型方式】
这种方式对比以上方式,有个很大的优势,就是它解决了方法函数会被生成多次的问题。它利用了对象的prototype属性。我们依赖原型可以重写对象实例。

var Obj = function () {}
Obj.prototype.name = 'me';
Obj.prototype.showName = function () {
alert(this.name);
}
var obj1 = new Obj();
var obj2 = new Obj();

我们依赖原型对构造函数进行重写,无论是属性还是方法都是通过原型引用的方式给新建的对象,因此都只会被创建一次。可惜的是,这种方式存在两个致命的问题:
1。没办法在构建对象的时候就写入想要的属性,因为原型在构造函数作用域外边,没办法通过传递参数的方式在对象创建的时候就写入属性值。只能在对象创建完毕后对值进行重写。
2。致命问题在于当属性指向对象时,这个对象会被多个实例所共享。考虑下面的代码:

var Obj = function () {}
Obj.prototype.name = 'me';
Obj.prototype.flag = new Array('A', 'B');
Obj.prototype.showName = function () {
alert(this.name);
}
var obj1 = new Obj();
var obj2 = new Obj();

obj1.flag.push('C');

alert(obj1.flag); // A,B,C
alert(obj2.flag); //A,B,C

是的,当flag属性指向对象时,那么实例obj1和obj2都共享它,哪怕我们仅仅改变了obj1的flag属性,但是它的改变在实例obj2中任然可见。
面对这个问题,让我们不得不想是否应该把【构造函数方式】和【原型方式】结合起来,让他们互补。。。

【构造函数和原型混合方式】
我们让属性用构造函数方式创建,方法用原型方式创建即可:

var Obj = function (name) {
this.name = name;
this.flag = new Array('A', 'B');
}
Obj.prototype = {
showName : function () {
alert(this.name);
}
}
var obj1 = new Obj();
var obj2 = new Obj();

obj1.flag.push('C');

alert(obj1.flag); // A,B,C
alert(obj2.flag); //A,B

这种方式有效地结合了原型和构造函数的优势,是目前用的最多,也是副作用最少的方式。
不过,有些追求完美的家伙还不满足,因为在视觉上还没达到他们的要求,因为通过原型来创建方法的过程在视觉上还是会让人觉得它不太像实例的方法(尤其对于传统OOP语言的开发者来说。)
所以,我们可以让原型活动起来,让他也加入到构造函数里面去,好让这个构造函数在视觉上更为统一。而这一系列的过程只需用一个判断即可完成。

var Obj = function (name) {
this.name = name;
this.flag = new Array('A', 'B');
if (typeof Obj._init == 'undefined') {
Obj.prototype = {
showName : function () {
alert(this.name);
}
};
Obj._init = true;
}
}

如上,用_init作为一个标志来判断是否已经给原型创建了方法。如果是那么就不再执行。这样其实在本质上是没有任何变化的,方法仍是通过原型创建,唯一的区别在于这个构造函数看起来“江山统一”了。
但是这种动态原型的方式是有问题的,《JavaScript高级程序设计》里并没有深究。创建第一个对象的时候会因为prototype在对象实例化之前没来的及建起来,是根本无法访问的。所以第一个对象是无法访问原型方法的。同时这种方式在子类继承中也会有问题。
关于解决方案,我会在下一文中说明。

其实就使用方便来说的话,个人觉得是没必要做这个判断的。。。呵呵 ^_^

『伍』 js 什么是面向对象

面向对象是一种开发方法或者是开发思想,面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

『陆』 凭什么js基于对象呢

JS是笑旦明一门基于对象、事件驱动编程的客户端脚碰告本语言。为什么JS不是面向对象的语言?因为面向对象包括三大特征:封装、继承、多态。JS中只有封装,继承也只是模拟继承,谈不上面向对象。迟搏所有说,在JS中,一切都是对象,属性、数组、函数等等都是对象。

『柒』 js面向对象编程思想是什么意思能不能举个例子

面向对象的编程思想就是把你需要解决的问题中的所有具体的东西,都看成一个对象,然后把所有具有相同性质的对象组成一个类,那些与问题无关的对象则忽略。

『捌』 新手如何理解JS面向对象开发

技术不是很好,怕是要误人子弟
举个例子
比方说一个游戏里面有“玩回家答”,而“玩家”就有血量、饥饿等属性。
于是便可以把“玩家”作为一个对象:
var player = {heath: 100, hunger:100}
你会发现“对象”是几种不同值的存储器。
然后你就可以用player.health来获取血量,player.hunger来获取饥饿
player.health = xx 以及 player.hunger = xx 来设置
但是当多人游戏时,会有很多“玩家”,然后你发现创建对象很麻烦,而且也不够“优雅”。
于是,就有了“构造方法”
不想写了。。接下来自己查教程了解,相信你会恍然大悟的

『玖』 JS的本质是什么

Javascript没有传统面向对象编程语言中的类,全部是对象。

Javascript中的对象是键值对的集合,键的类型是字符串,值可以是任意对象。创建新对象的方式有:new 函数()、{}语法、Object.create(原型对象)。

函数也是对象,是一种包含可运行的代码的特殊对象,并且代码能够以函数调用的形式被执行。函数对象能通过function关键字定义或通过new关键字使用Function构造函数来创建。


所以,在深入理解Javascript的时候,要谨防长期使用C++、C#等编程语言造成的思维定势却给使用Javascript带来误导。



『拾』 javascript是面向对象还是面向过程

javascript是面向过程的,因为是解释性预言,按照页面加载一行一行的执行,但是可以模拟面向对象的代码写法

阅读全文

与怎么理解js是面向对象编程相关的资料

热点内容
app原型图是什么东西 浏览:237
ug直接用cad文件建模 浏览:272
苹果电脑打开mp4文件 浏览:337
数据线一直发烫怎么回事 浏览:830
IBM代码5 浏览:279
编程时如何让输出结果之间有空格 浏览:112
怎么复制网上文件 浏览:675
苹果怎么关掉网站禁止访问 浏览:478
win10适合机械硬盘吗 浏览:586
qq头像欧美男霸气头像 浏览:368
java批量修改数据返回值 浏览:517
wp81创建文件夹 浏览:968
iphone高科技软件 浏览:654
手机端怎么看网页代码 浏览:925
什么软件能把手机变成苹果版本的 浏览:841
ps精修瓶子视频教程 浏览:481
win10惠普recovery盘 浏览:172
电脑网络问题是怎么回事 浏览:193
微信刷卡支付接口开发 浏览:443
win10电脑屏幕旋转90度怎么复原 浏览:456

友情链接