JavaScript类的写法


Posted in Javascript onSeptember 17, 2016

我们知道,在js中,是没有类的概念的。类的所有实例对象都从同一个原型对象上继承属性,因此,原型对象是类的核心。

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。———百度百科

早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成类。

在js中,写成类的本质基本都是 构造函数+原型。下面,就讨论一下js类的几种写法:

构造函数法

/**
* Person类:定义一个人,有name属性和getName方法
  */
<script>
  function Person(name){
    this.name = name;
    this.getName = function(){
      return this.name;
    }
  }

  //我们在这里实例化几个对象
  
  var p1 = new Person("trigkit4");
  var p2 = new Person("mike");

  console.log(p1 instanceof Person);//true
  console.log(p2 instanceof Person);//true
</script>

由上面控制台输出结果可知,p1和p2的确是类Person的实例对象。instanceof操作符左边是待检测类的对象,右边是定义类的构造函数。这里,instanceof用来检测对象p1是否属于Person类。

这种方式的优点是:我们可以根据参数来构造不同的对象实例 ,缺点是每次构造实例对象时都会生成getName方法,造成了内存的浪费 。

我们可以用一个外部函数来代替类方法,达到了每个对象共享同一个方法。改写后的类如下:

//外部函数
<script>
  function getName() {
    return this.name;
  }

  function Person(name){
    this.name = name;
    this.getName = getName;//
  }
</script>

原型方式

<script>
  function Person(){};
  Person.prototype.name = "trigkit4";//类的属性都放在prototype上
  Person.prototype.getName = function(){
    return " I'm " + this.name;
  }

  var p1 = new Person();
  var p2 = new Person();
  console.log(p1.name);//trigkit4
  console.log(p2.getName());//I'm trigkit4
</script>

原型方式的缺点就是不能通过参数来构造对象实例 (一般每个对象的属性是不相同的) ,优点是所有对象实例都共享getName方法(相对于构造函数方式),没有造成内存浪费 。

构造函数+原型方式
取前面两种的优点:
a、用构造函数来定义类属性(字段)。
b、用原型方式来定义类的方法。

<script>
  function Person(name){
    this.name = name;
  }

  //原型的特性可以让对象实例共享getName方法
  Person.prototype.getName = function(){
    return " I'm " + this.name;
  }
</script>

这样,我们就既可以构造不同属性的对象,也可以让对象实例共享方法,不会造成内存的浪费。

为了让js代码风格更紧凑,我们让prototype方法代码移到function Person的大括号内。

<script>
  function Person(name){
    this.name = name;
    Person.prototype.getName = function(){
      return name;//不宜用this.name
    }
  }

  var p1 = new Person('trigkit4');
  console.log(p1.getName());//trigkit4
</script>

在这里,我们需要知道的几种定义类的方法,除了上面的构造函数外,还有:

Object.create()方法
用这个方法,"类"就是一个对象,而不是函数。

var Person = {
    name : "trigkit4",
    age : 21,
    run: function(){
      alert("I like running");
    }
  }

然后,直接用Object.create()生成实例,不需要用到new。

var p1 = Object.create(Person);
  alert(p1.age);//21
  p1.run();//I like running

这种方法比"构造函数法"简单,但是不能实现私有属性和私有方法,实例对象之间也不能共享数据,对"类"的模拟不够全面。

createNew()方法
这种方法不需要用到this和prototype,其做法是用对象来模拟一个类,然后在类里面定义一个构造函数createNew(),然后在createNew()里面定义实例对象,把这个实例对象作为返回值。

<script>
  var Person = {

    createNew : function () {
      var person = {};
      person.name = "trigkit4";
      person.run = function(){
        alert("I like running");
      };
      return person;
    }

  }
</script>

使用的时候,调用createNew()方法,就可以得到实例对象。

var p1 = Person.createNew();
  p1.run();//I like running

这种写法其实和对象字面量的写法是很类似的,只不过一个是逗号分隔,一个是分号分隔。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 日期对象Date扩展方法
May 30 Javascript
Javascript 验证上传图片大小[客户端]
Aug 01 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
Aug 09 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
Jan 23 Javascript
Js nodeType 属性全面解析
Nov 14 Javascript
html5+javascript制作简易画板附图
Apr 25 Javascript
javascript数组排序汇总
Jul 07 Javascript
JS+CSS3制作炫酷的弹窗效果
Nov 08 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
Jan 08 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
May 16 Javascript
JS数组及对象遍历方法代码汇总
Jun 16 Javascript
JS如何判断对象是否包含某个属性
Aug 29 Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 #Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
Sep 17 #Javascript
JavaScript每天必学之数组和对象部分
Sep 17 #Javascript
JavaScript每天必学之基础知识
Sep 17 #Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 #Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
Sep 17 #Javascript
利用JS提交表单的几种方法和验证(必看篇)
Sep 17 #Javascript
You might like
mysql数据库差异比较的PHP代码
2012/02/05 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
php二维码生成以及下载实现
2017/09/28 PHP
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
Python实现八大排序算法
2016/08/13 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
简单了解django索引的相关知识
2019/07/17 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
Django REST framwork的权限验证实例
2020/04/02 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
用Python创建简易网站图文教程
2021/06/11 Python
golang中字符串MD5生成方式总结
2021/07/04 Golang