一、类,对象和原型

类是具体事物的抽象,而对象是类的实例。举个例子,学生类可以有nama属性,grade属性,study方法等等,而对于学生类的实例就具体到某一个学生上去了,如name:小红 grade:高二 等等
理解了类和对象我们再来说说原型,在JS中不区分类和实例的概念,而是通过原型来实现面向对象编程
比如我们要实现小红这个对象,我们可以通过下面在这个小明的对象实现

 var xiaoming = {name: '小明',height: '高一',study: function() {console.log(this.name + '正在学习');}};var xiaohong = {name: '小红'};xiaohong.__proto__ = xiaoming;//让xiaohong对象的原型指向xiaomingxiaohong.study(); //小红正在学习

你可以理解对小红这个对象是以小明为原型创造,或是先将小明这个对象抽象成类,再根据这个类创造小红这个对象。

proto:隐式原型,JS每个对象中内置的属性,用于指向对象的原型对象
由此,可以得出一条原型链,根据对象的__proto__属性一直找,就会得到一条原型链,如定义一个数组 var arr = [1, 2, 3];就会有原型链
arr ----> Array.prototype ----> Object.prototype ----> null
instanceof就是通过__proto__属性,顺着原型链一直寻找来判断的,而xiaohong.proto = xiaoming;就是构建了一条xiaohong->xiaoming的原型链。原型链左端,继承原型链右端的方法。故可以给原型链右端增加公用的方法,使原型链左端都拥有此方法而且省内存。

二、prototype与constructor

JS中函数也是一个对象,故JS可以用构造函数的方法来创建对象

function Student(name) {this.name = name;this.hello = function () {alert('Hello, ' + this.name + '!');}
}var xiaoming = new Student('小明');// 使用new 关键字调用一个函数返回一个对象
xiaoming.name; // '小明'
xiaoming.hello(); // Hello, 小明!

用new Student()创建的对象还从原型上获得了一个constructor属性,它指向函数Student本身
prototype:显示原型,JS每个函数中内置的属性,用于指向函数的原型对象

console.log(Student.prototype.constructor===Student)//true

class

ES6引入了class,使得JS可以定义一个类,与Java相似

class Student {constructor(name) {this.name = name;}hello() {alert('Hello, ' + this.name + '!');}
}//支持用extends关键词进行类的继承class PrimaryStudent extends Student {constructor(name, grade) {super(name); // 记得用super调用父类的构造方法!this.grade = grade;}myGrade() {alert('I am at grade ' + this.grade);}
}

JS面向对象,__proto__和prototype详解相关推荐

  1. JS es6的Class类详解

    文章目录 JS es6的Class类详解 class基本语法 Class的基本语法之constructor Class的基本语法之类的调用方式 Class的基本语法之getter和setter Cla ...

  2. Vue中 Vue.prototype 详解及使用——作用:避免和已被定义的数据、方法、计算属性产生冲突

    Vue中 Vue.prototype 详解及使用--作用:避免和已被定义的数据.方法.计算属性产生冲突 **应用场景:**在很多组件里用到数据/实用工具,但是不想污染全局作用域.这种情况下,可以通过在 ...

  3. js showModalDialog参数的使用详解(转)

    js showModalDialog参数的使用详解_javascript技巧_脚本之家 http://www.jb51.net/article/45281.htm 本篇文章主要是对js中showMod ...

  4. [js]JavaScript Number.toPrecision() 函数详解

    [js]JavaScript Number.toPrecision() 函数详解 JavaScript: numberObject.toPrecision( [ precision ] ) 如果没有提 ...

  5. node mysql 查询_Node.js使用mysql进行查询详解

    本篇教程介绍了Node.js使用mysql进行查询详解,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 因为返回的是个对象 var selectSql1=&quo ...

  6. js中小括号()的用法详解

    一.js中小括号()的用法详解 1.作为分组运算符: 分组运算符应该是再熟悉不过了,因为在小学数学中就有应用,例如: var a=(1+2)*4; console.log(a); 以上代码的输出值是1 ...

  7. js购物车功能php,使用JS实现购物车功能步骤详解

    这次给大家带来使用JS实现购物车功能步骤详解,使用JS实现购物车功能的注意事项有哪些,下面就是实战案例,一起来看一下. 我们肯定都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪 ...

  8. JS中的event 对象详解

    JS中的event 对象详解 JS的event对象 Event属性和方法: 1. type:事件的类型,如onlick中的click: 2. srcElement/target:事件源,就是发生事件的 ...

  9. js中indexOf的用法详解

    js中indexOf的用法详解 String.IndexOf 方法 (Char, [startIndex], [count]) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检 ...

最新文章

  1. 梯度下降法原理及实现
  2. (转)计算几何模板 - kuangbin
  3. css实现loading,CSS3 19种LOADING(加载)动效
  4. 不同权限访问详细细节
  5. ENVI修复图像坏点扩展补丁
  6. aws实例启动失败_AWS:启动安装了APOC的Neo4j实例
  7. python以写模式打开录入_Python的学习(六)—-文件和输入输出处理 | 学步园
  8. Redis系列 --第一篇
  9. 大学计算机基础应当掌握的内容,大学计算机基础课程教学大纲2014版.pdf
  10. 网络分解的时代即将到来,云服务商正在铺路 | 分析师洞察
  11. php服务器端注释,php标识和注释
  12. 【递推】1193:吃糖果
  13. CVPR 2022 | 即插即用!南洋理工商汤开源SAM-DETR: 利用语义对齐匹配实现快速收敛的DETR...
  14. Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
  15. 综合布线系统计算机网络,综合布线 计算机网络系统
  16. Vista 自动激活工具(最新 最权威 所有版本 可升级)
  17. 获取苹果设备的UDID
  18. 在 Android Studio 里面运行标准 Java 工程
  19. 学会Redis缓存中间件,这一篇就够了
  20. bootstrap-table的refresh查询

热门文章

  1. Android开发笔记(七十一)区分开发模式和上线模式
  2. python 字符串中符号的意义
  3. 流程图符号以及绘制流程图方法
  4. Mybatis中的StatementType
  5. 第10讲 | 深入区块链技术(二):P2P网络
  6. 如何利用Webp和http缓存节省30%的网络流量
  7. Ocata:Packstack Ocata does not configure nova for placement API
  8. openStack vm备份
  9. centos activemq 集群配置 Networks of Brokers
  10. in-list iterator