当前位置: 首页 > news >正文

JavaScript三(对象思想)

JavaScript并不是面向对象的程序设计语言,但它是基于对象的。JavaScript中的每个函数都可用于创建对象,返回的对象既是该对象的实例,也是object的实例 。 

一.对象与关联数组

JavaScript中的对象本质上是一个关联数组,就像Java里的Map数据结构,有一组key-value对组成,不同的是JavaScript对象的value不仅可以是值,也可以是函数,该函数就是该对象的方法。

当value是基本类型的值或者复合类型的值的时候,此时value就是该对象的属性值。

                                                                                                                                                                                                                                                      

因此访问某个JavaScript对象时,不仅可以使用obj.propName的形式,也可以采用obj[propName]的形式,有时候必须使用这种形式。

 

<script type="text/javascript">
    function Person(name,age)
    {
      this.name = name;
      this.age = age;
      this.info = function(){
        alert("info方法");
      }
    }

    var p = new Person('Sherman',30);
    for(propName in p)
    {
      document.writeln("p对象的"+propName+"属性的属性值是"+p[propName]+'<br/>')
    }
  </script>

 

 

二.继承和prototype

JavaScript没有提供显示的继承语法,每个对象都是object的子类,因而各对象之间平等,各对象之间不存在直接的父子关系。

JavaScript提供了一些内建类,,通过这些内建类可以方便的创建各自对象。

JavaScript是一种动态语言,允许自由地为对象增加属性和方法,当程序为对象不存在的属性赋值时,即可认为为该对象增加属性,例如

var p = {}
p.age=30;
p.info = function(){
alert('info方法');
}

 JavaScript的所有类都有一个protoType属性,如果为JavaScript类的protoType的属性增加属性,方法,则可视为对原有类的拓展。我们可以理解为:增加了protoType属性的类继承了原有的类,

这是JavaScript的伪继承机制。看下面代码:

<script type="text/javascript">
    function Person(name,age)
    {
      this.name = name;
      this.age = age;
      this.info = function(){
        document.writeln('姓名:'+this.name+'<br/>');
        document.writeln('年龄:'+this.age+'<br/>');
      }
    }
    var p1 = new Person('Sherman',23);
    p1.info();

    Person.prototype.walk = function()
    {
     document.writeln(this.name+'慢慢的溜达...<br/>')
    }
    document.writeln('<hr/>');
    var p2 = new Person('Leegang',30);
    p2.walk();
    p1.walk();
  </script>

 

注意的是,伪继承的本质是修改了原有的类,并不是产生新的子类

通过使用protoType属性可以为JavaScript内建类进行拓展

<script type="text/javascript">
    Array.prototype.indexof = function(obj)
    {
      var result = -1;
      for(var i = 1;i < this.length;i++)
      {
        if(this[i] == obj){
          result = 1;
          break;
        }
      }
      return result;
    }

    var arr = [4,5,7,-2];
    alert(arr.indexof(-2));
  </script>

 此外,protoType代表了该类的原型对象,在默认情况下,JavaScript类的protoType属性值是一个对象,将JavaScript类的protoType设为父类实例,可实现JavaScript的继承,例如:

<script type="text/javascript">
    function Person(name,age)
    {
      this.name = name;
      this.age = age;
    }
    Person.prototype.sayHello = function()
    {
      console.log(this.name+'向您打招呼');
    }

    var per = new Person('牛魔王',30000);
    per.sayHello();

    function Student(grade)
    {
      this.grade = grade;
    }

    Student.prototype = new Person('未命名',0);
    Student.prototype.intro = function()
    {
      console.log("%s是个学生,读%d年级",this.name,this.grade);

    }

    var stu = new Student(5);
    stu.name = '孙悟空';

    console.log(stu instanceof Student);//输出true
    console.log(stu instanceof Person);//输出true
    stu.sayHello();
    stu.intro();
  </script>

三.构造器实现伪继承

实现代码如下:

<script type="text/javascript">
  function Person(name,age)
  {
    this.name = name;
    this.age = age;
    this.sayHello = function()
    {
      console.log(this.name+'向您打招呼!');
    }
  }

  var per = new Person('牛魔王',30000);
  per.sayHello();

  function Student(name,age,grade)
  {
    this.a = Person;
    this.a(name,age);
    this.grade = grade;
  }

  Student.prototype.intro = function()
  {
    console.log("%s是个学生,读%d年级",this.name,this.grade);
  }

  var stu = new Student('孙悟空',34,5);
  console.log(stu instanceof Student);//输出true
  console.log(stu instanceof Person);//输出true
  stu.sayHello();
  stu.intro();
</script>

 四.使用apply或call实现伪继承

实现代码如下:

<script type="text/javascript">
    function Person(name,age)
    {
      this.name = name;
      this.age = age;
      this.sayHello = function()
      {
        console.log(this.name+'向您打招呼!');
      }
    }

    var per = new Person('牛魔王',30000);
    per.sayHello();

    function Student(name,age,grade)
    {
      //this.a = Person;
     // this.a(name,age);
      Person.call(this,name,age);
      Person.apply(this,[name,age]);
      this.grade = grade;
    }

    Student.prototype.intro = function()
    {
      console.log("%s是个学生,读%d年级",this.name,this.grade);
    }

    var stu = new Student('孙悟空',34,5);
    console.log(stu instanceof Student);//输出true
    console.log(stu instanceof Person);//输出true
    stu.sayHello();
    stu.intro();
  </script>

输出结果同上

五.创建对象

JavaScript创建对象大致有3种方式:

1.使用new关键字调用构造器创建对象

2.使用object类创建对象

//创建一个默认的对象
var obj = new Object();

这是空对象,没有任何属性和方法,但是JavaScript是动态语言,可以动态的为对象增加属性和方法

如下代码:

<script type="text/javascript">
    var myobj = new Object();
    myobj.name = 'Sherman';
    myobj.age = 34;
    document.writeln(myobj.name+myobj.age);//输出Sherman34
  </script>

 

3.使用Json语法创建对象

 使用Json语法创建JavaScript对象时,属性值不仅可以是普通字符串,也可以是任何基本数据类型,还可以是数组,函数,甚至是另外一个JSON语法创建的对象。

Person = 
      {
        name:'Sherman',
        gender:'male',
        son:{
          name:'guoguo',
          grade:1
        },
        info:function()
        {
          document.writeln('姓名:'+this.name+'性别:'+this.gender);
        }
      }
  </script>

也可以使用JSON语法创建数组

arr = [vlue1,value2,value3,...]

如下代码,创建了一个复杂的JSON对象

 Person =
      {
        name:'Sherman',
        age:29,
        schools:['小学','中学','大学'],
        parents:[{
          name:'father',
          age:49,
          address:'广州'
        },{
          name:'mother',
          age:51,
          address:'深圳'
        }]
      }

 

转载于:https://www.cnblogs.com/yumiaoxia/p/9000723.html

相关文章:

  • IDEA搭建工程
  • python学习笔记-day7-2-【python从mysql数据库导数据到excel,读excel,修改excel】
  • linux下实现多台服务器同步文件(inotify-tools+rsync实时同步文件安装和配置)
  • Python实用笔记 (15)函数式编程——装饰器
  • LuoguP3621 [APIO2007]风铃
  • Python变量和基本数据类型
  • Transaction rolled back because it has been marked as rollback-only
  • 微信网页版的onclick事件不起作用
  • 记录MongoDB常用查询
  • Linux环境下mysql的root密码忘记解决方法(2种)
  • Oracle入门《Oracle介绍》第一章1-3 Oracle 逻辑组件
  • Vue2.0 的漫长学习ing-3-4
  • SDN学习笔记mininet+ryu开篇
  • C语言小游戏系列—恶搞关机软件,加强版
  • 第三次团队作业
  • Angular 响应式表单之下拉框
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Javascript 原型链
  • Koa2 之文件上传下载
  • LeetCode18.四数之和 JavaScript
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Node 版本管理
  • Rancher如何对接Ceph-RBD块存储
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpiderData 2019年2月16日 DApp数据排行榜
  • vue 个人积累(使用工具,组件)
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 从重复到重用
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • - 概述 - 《设计模式(极简c++版)》
  • 一起参Ember.js讨论、问答社区。
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​如何防止网络攻击?
  • #Linux(权限管理)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (四)鸿鹄云架构一服务注册中心
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat批处理出现中文乱码的情况
  • .NET CLR基本术语
  • .NET开发者必备的11款免费工具
  • /proc/stat文件详解(翻译)
  • ?.的用法
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @hook扩展分析
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序