开发者社区> 水车306> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

javascript类的类比详解-大白话版

简介: 转载请注明出处:水车 如果有误,还望指出,谢谢 -----------------正文分割线---------------------- 类:类太抽象,要想弄明白就该用现实的东西来类比 在我看来类就是造一个有许多(当然一个也可以)功能的东西的机器(这里这个东西可以称之为对象),比如一台收音机要...
+关注继续查看

转载请注明出处:水车

如果有误,还望指出,谢谢

-----------------正文分割线----------------------

类太抽象,要想弄明白就该用现实的东西来类比
在我看来类就是造一个有许多(当然一个也可以)功能的东西的机器(这里这个东西可以称之为对象),比如一台收音机
要想有一台收音机,我们得先有一台造收音机的机器,这个机器就是我们所说的类

// 这就是这台造收音机的机器;他可以显示时间,有形状等等(即属性)
function radio (){
    this.time = '12:00';
    this.form = '长方形';
}
//再给他加一个收听长波信号的功能;(即方法)
radio.prototype.fm = function(){};
//再给他加一个收听短波信号的功能;(即方法)
radio.prototype.am = function(){};
//加一个其他什么功能;(即方法)
radio.prototype.another = function(){};


这里你想让造出来的收音机有哪些功能,都是可以随时添加更改的 (用prototype方法添加方法)
这台机器已经放到厂房里了,而它什么时候开始运作呢?它随时准备着;
当我想要一台收音机的时候(类的实例化,也叫对象)

var me-radio = new radio();

  

这时我就有了一台收音机了。我想使用这个收音机,听听短波频道,我就用

me-radio.am()

  

想听长波我就用

me-radio.fm()

  

我想用其他的什么功能用

me-radio.another();

  

过了一天,我姐也想要一台一样的收音机,那好办啊,我厂子里有一台专门造收音机的机器了,我怕啥,给她一台。

var sister-radio = new radio();

 


好了,我姐也有一台收音机了,而且和我的收音机的功能是一模一样的。它也可以听长波,听短波。
那我妹妹妹也想要一台,给她也new一台(new radio()),我七大舅八大姨的都要,好,都给。

  

  这时我爸来了,说也给我一台收音机吧,可是你现在这个收音机的功能不能满足我,我要的这个收音机必须可以打电话,你给我造一个吧,怎么办呢?
父命难违啊,硬着头皮上吧

先分析1:再造一台造收音机的机器吧(再创建一个radio2的类)把该有的功能(属性和方法)都加上也行,可是之前的机器造的收音机,普通的功能都有了,再造就感觉重复了,而且厂房里放那么多造收音机的机器会不会有点挤啊(耗内存),所以这个方法不是最好的


后分析2:我就把原来这台机器给改了,让这台机器以后造出来的收音机都可以打电话;也行,可是这里有一个问题,就是以前的收音机每天都得拿回来维护,你这一修改,姐们,舅们,七大姑八大姨的收音机再维护的时候都有了打电话的功能,哈哈,吓人不? 所以这个也不行;

再分析3:在radio机器造出来(new)的收音机上直接改装增加一个打电话的功能不就好了,好,说干就干,我爸还等着收音机打电话呢;
(类的继承)
/** javascript的继承有六七种方法了,我就不细说了。这里用一个比较新的方法:Object.create(); 语法:Object.create(prototype, descriptors),第一个参数是要继承的原形,第二个是可选参数,包含一个或多个属性描述符的 JavaScript 对象**/

Object.create()他可以给一个空盒装上你想让他装的东西,它便宜,还小,能直接揣兜里,扩展性还非常好。他的功能就是可以花很小的代价就复制一个造收音机的机器。

首先,我们先创建一个这样的空盒子(函数对象),当然,你也可以给这个空盒子里装你想装的东西;

1 var photoRadio = function (){
2   //可以装东西,也可以不装;
3   this.name = '可以打电话的收音机';
4 }

 


既然是在原来一模一样的收音机上改造,那就的把原来那些方法和属性都拿过来;
  先拿属性:

1 var photoRadio = function (){
2 this.name = '可以打电话的收音机';
3 radio.call(this); //先拿属性:
4 }

 


  再拿方法:

photoRadio.prototype = Object.create(radio.prototype);

 



到这里,我们就复制了一个可以造和原来收音机一模一样的机器了;这个机器叫 photoRadio;
现在我们就给添加打电话的功能吧。
到这里会有不懂的同学要问了,这么麻烦,还不如我直接再写一个类呢,是的,现在看来再写一个类是快,可是,如果radio有成千上万个方法,而不是三个,那你还会重新写一个吗?
好了,解决了那个同学的疑问,我们继续给新机器添加功能吧

photoRadio.prototype.photo= function(){}

 


这里我们就有了一个可以造打电话的收音机了的机器了;
赶快给我爸造收音机吧:

var father-radio = new photoRadio();
//记得造出来的收音机是要打开用的。就是在打电话是这样
father-radio.photo();

 


好了,我们家里人都有收音机了,你会造了吗?
完整代码:

 1 function radio(){ //创建第一个对象radio
 2 this.time = '12:00'; //对象的属性
 3 this.form = '长方形';//对象的属性
 4 }
 5 radio.prototype.fm = function(){ //给对象添加fm方法
 6 console.log('这是fm功能');
 7 console.log(this.time);
 8 };
 9 radio.prototype.am = function(){//给对象添加am方法
10 console.log('这是am功能');
11 };
12 var me_radio = new radio(); //实例化radio对象
13 
14 var photoRadio = function () {创建第二个对象photoRadio
15 this.name = 'aaa' // photoRadio对象的属性
16 radio.call(this); // 把radio对象的属性继承过来
17 };
18 
19 photoRadio.prototype = Object.create(radio.prototype); // 把radio对象的方法继承过来
20 
21 var father_radio = new photoRadio(); // 实例化photoRadio
22 
23 father_radio.fm(); //使用实例化后的对象;

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaScript 类继承
和其他功能一样,ECMAScript 实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。
900 0
对Javascript 类、原型链、继承的理解
一、序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承。
998 0
旧文新帖(First out:2008-06-07):JavaScript“类”继承的横向比较
本文最早发表于2008-06-07 首入眼帘,代码: /** * Utility to set up the prototype, constructor and superclass properties to * support an inheritance strategy that can chain constructors and methods.
613 0
Python全栈 Web(JavaScript DOM树、DOM对象、BOM对象)
外部对象: BOM和DOM BOM: Browser Object Module 浏览器对象模型 将浏览器比喻成一个对象-window (网页初始化自动创建) 可以通过window对象操作浏览器 DOM: Document Object .
2088 0
+关注
水车306
笑看前端程序员写后端
267
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载