资讯专栏INFORMATION COLUMN

week 17

taoszu / 592人阅读

摘要:考虑基于扩展出,原型链必须修改为这样实现方法的构造函数引入中间对象空函数修改两个属性,以实现上述原型链在的原型对象上定义方法创建子类对象小明验证原型原型链图示

面向对象编程

传统的基于class的面向对象语言如Java中,都有两个基本概念:

类:类是对象的实例模版,本身是一种类型。如:

实例:实例是根据类创建的对象。Student xiaoming = new Student()

而JS不区分类和实例的概念,它通过原型(prototype)实现面向对象。JS创建对象是用原型,实现继承也是用原型。

创建对象:

var Student = {name: "abc", height: 1.7}; 
var xiaoming = {name: "xiaoming"};
xiaoming._proto_ = Student;  

创建对象

JS对每个创建的对象都会设置一个原型,指向它的原型对象。
当使用obj.***访问一个对象的属性时,JS现在当前对象上查找该属性;如果没找到,就到其原型对象上找;如果还没找到,就一直上溯到Object.prototype这个原型对象;最后,如果还没找到,就返回undefined。这个过程可以表示为一个原型链

// 构造函数对象
function Student(name) {
    this.name = name;  //这里设置了每个对象的属性
}
// 原型对象
Student.prototype.hello = function() {
    alert("Hello, " + this.name);  //这里设置了所有对象共享的hello函数,通过继承获得
}
// 实例对象
var xiaoming = new Student("小明");
var xiaohong = new Student("小红");

原型链如下(图中红色箭头是原型链):

xiaoming
xiaohong -- Student.prototype ----> Object.prototype ----> null

  


补充:
见犀牛书

原型继承

Java中,继承的本质是:扩展一个已有的Class,生成一个新的Subclass。由于Java严格区分实例,继承实际上是类型的扩展

而JS无法直接扩展一个Class,因为不存在Class这种类型,JS采用的是原型继承

考虑基于Student扩展出PrimaryStudent,原型链必须修改为这样:

new PrimaryStudent() ----> PrimaryStudent.prototype ----> Student.prototype ----> Object.prototype ----> null

实现方法:

// PrimaryStudent的构造函数
function PrimaryStudent(props) {
    Student.call(this, props);
    this.grade = props.grade || 1;
}

// 引入中间对象:空函数F
function F() {}
F.prototype = Student.prototype;

// 修改两个属性,以实现上述原型链
PrimaryStudent.prototype = new F();
PrimaryStudent.prototype.constructor = PrimaryStudent;

// 在PrimaryStudent的原型对象上定义方法
PrimaryStudent.prototype.getGrade = function() {
    return this.grade;
}

// 创建子类对象
var xiaoming = new PrimaryStudent({name: "小明", grade: 60});

// 验证原型
xiaoming.__proto__ === PrimaryStudent.prototype;     //true
xiaoming.__proto__.__proto__ === Student.prototype;  //true

原型链图示:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85821.html

相关文章

  • 浅谈JSONObject解析JSON数据

    摘要:感冒指数易发感冒容易发生,少去人群密集的场所有利于降低感冒的几率。穿衣指数舒适白天温度适中,但早晚凉,易穿脱的便携外套很实用。运动指数不适宜受到阵雨天气的影响,不宜在户外运动。 个人博客同步文章 https://mr-houzi.com/2018/06/... 根据一段天气API来说一下JSONObject如何解析json数据,尽管现在在开发中使用Gson等,对于像我这样初次使用Ja...

    mindwind 评论0 收藏0
  • CI Weekly #17 | flow.ci 支持 Java 构建以及 Docker/DevOps

    摘要:携程容器云实践这篇文章介绍了携程技术团队容器云的相关实践,包括实践在线旅游与弹性需求容器云定位容器部署基本原则容器编排选型取舍容器网络选型遇到的问题容器监控方案。 这周一,我们迫不及待写下了最新的 changelog —— 项目语言新增「Java」。创建 Java 项目工作流和其它语言项目配置很相似,flow.ci 提供了默认的 Java 项目构建流程模版,快去试试吧~showImg(...

    oujie 评论0 收藏0
  • Fabric环境搭建

    摘要:环境搭建快速入门前提安装安装安装安装查看版本信息输出安装查看版本信息输出版本要求版本要求上传解压文件编辑环境变量文件添加如下内容输出如果系统中有旧版本的则使用如下命令卸载旧版本的然后再重新安装 环境搭建 快速入门: http://hyperledger-fabric.rea... 前提 安装git $ sudo apt update $ sudo apt install git 安装...

    fou7 评论0 收藏0
  • js获取当前时间(昨天、今天、明天)

    摘要:更新今天又发现了一种简单的方法可以直接对年月日时分秒进行操作,假如今天那么所得昨天为昨天的时间前天的时间其中,函数为扩展函数。 1、时间格式化 1 //昨天的时间 2 var day1 = new Date(); 3 day1.setTime(day1.getTime()-24*60*60*1000); 4 var s1 = day1.getFullYear()+- + (da...

    rainyang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<