Class 的实例对象

ES6 生成类的实例对象的写法,与 ES5 完全一样,也是使用new命令。前面说过,如果忘记加上new,像函数那样调用Class,将会报错。

  1. class Point {
  2. // ...
  3. }
  4. // 报错
  5. var point = Point(2, 3);
  6. // 正确
  7. var point = new Point(2, 3);

与 ES5 一样,实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。

  1. //定义类
  2. class Point {
  3. constructor(x, y) {
  4. this.x = x;
  5. this.y = y;
  6. }
  7. toString() {
  8. return '(' + this.x + ', ' + this.y + ')';
  9. }
  10. }
  11. var point = new Point(2, 3);
  12. point.toString() // (2, 3)
  13. point.hasOwnProperty('x') // true
  14. point.hasOwnProperty('y') // true
  15. point.hasOwnProperty('toString') // false
  16. point.__proto__.hasOwnProperty('toString') // true

上面代码中,xy都是实例对象point自身的属性(因为定义在this变量上),所以hasOwnProperty方法返回true,而toString是原型对象的属性(因为定义在Point类上),所以hasOwnProperty方法返回false。这些都与 ES5 的行为保持一致。

与 ES5 一样,类的所有实例共享一个原型对象。

  1. var p1 = new Point(2,3);
  2. var p2 = new Point(3,2);
  3. p1.__proto__ === p2.__proto__
  4. //true

上面代码中,p1p2都是Point的实例,它们的原型都是Point.prototype,所以__proto__属性是相等的。

这也意味着,可以通过实例的__proto__属性为“类”添加方法。

__proto__并不是语言本身的特性,这是各大厂商具体实现时添加的私有属性,虽然目前很多现代浏览器的 JS 引擎中都提供了这个私有属性,但依旧不建议在生产中使用该属性,避免对环境产生依赖。生产环境中,我们可以使用Object.getPrototypeOf方法来获取实例对象的原型,然后再来为原型添加方法/属性。

  1. var p1 = new Point(2,3);
  2. var p2 = new Point(3,2);
  3. p1.__proto__.printName = function () { return 'Oops' };
  4. p1.printName() // "Oops"
  5. p2.printName() // "Oops"
  6. var p3 = new Point(4,2);
  7. p3.printName() // "Oops"

上面代码在p1的原型上添加了一个printName方法,由于p1的原型就是p2的原型,因此p2也可以调用这个方法。而且,此后新建的实例p3也可以调用这个方法。这意味着,使用实例的__proto__属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。

es6 Class 的实例对象相关推荐

  1. javascript中实例对象和构造函数关系、原型语法、原型链、call实现继承、apply调用函数、bind拷贝函数、拷贝继承、class类、super、严格模式、高阶函数、闭包、递归、es6简介

    实例对象和构造函数的关系及原型: 实例对象是通过构造函数创建出来的,实例对象的构造器constructor就是指向构造函数的:每个实例对象中的同一方法的指向是各不相同的,但是其属性值相同的属性可以相同 ...

  2. 前端与移动开发----JS高级----面向对象编程,类与实例对象,继承,严格模式,模板字符串,class封装tab栏

    JS高级01 回顾上阶段 Javascript组成 ECMAScript: 基础语法 (变量, 表达式, 循环, 判断, 函数, 对象等) DOM: document 操作标签(获取, 增加, 插入, ...

  3. 【Javascript】通过实例对象修改原型对象属性的值

    结论: 当原型对象的属性值为基本数据类型时,无法通过实例对象直接修改原型对象的属性值.当原型对象的属性值为引用数据类型时,可以直接通过实例对象修改原型对象的属性值. 基本类型的数据值有7种:字符串(S ...

  4. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

  5. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  6. 一张图说明 函数, 实例(对象), 原型之间的关系

    前言 很多初学者都对函数,实例(对象), 原型之间的关系理不清楚. 网上五花八门的文章很多,要么不知所云,要么是晦涩难懂. 本文意在用最简洁的语言跟示例让初学者理清楚这三者之间的关系,无需理会其内部原 ...

  7. python类对象和实例对象

    类对象支持两种操作:属性引用和实例化. 属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name. 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称. 因此,如果类定 ...

  8. 静态方法中不能new内部类的实例对象的总结

    class Test{public void main(String[] args){A testA=new A(); //这里会出现问题new Thread(new Runnable(){publi ...

  9. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )

    文章目录 一.创建 Capstone 反汇编解析器实例对象 二.设置 Cs 汇编解析器显示细节 一.创建 Capstone 反汇编解析器实例对象 使用 Capstone 反汇编框架 , 首先创建 Ca ...

最新文章

  1. 图1 ----节选CEC2015年中结果展示
  2. 基于bmob的校园资料分享互助平台
  3. oracle 更改ip
  4. Solaris10之SVM简析
  5. 一起因网线问题引起的网络故障的解决过程
  6. 同时给两个变量值赋值
  7. python怎么保存文件代码_Python文件读写保存操作的实现代码
  8. 用u盘做引导,往硬盘中安装ubuntu
  9. .net 连接php,NetBeans平台如何连接到PHP解析器?
  10. boost::log::sinks::syslog用法的测试程序
  11. 使用Live Writer和NNTP Bridge阅读微软论坛
  12. photo-sphere-viewer.js使用时图片拉伸的问题
  13. 【重点!DP】LeetCode 115. Distinct Subsequences
  14. java最长同值路径_力扣——最长同值路径
  15. css3技巧——产品列表之鼠标滑过效果(一)
  16. 微信小程序上线问题与经验总结
  17. quartz定时任务框架
  18. [译]C++17,使用 string_view 来避免复制
  19. viper4Android md风格,ViPER4Android音效驱动
  20. 无线路由器显示无服务器,路由器没信号怎么办?三招教你解决问题!

热门文章

  1. Skype For Business Server 2015 离线消息
  2. 腾讯优测-优社区干货精选 |安卓适配之Camera拍照时快门咔嚓声
  3. 修改am335x 制作android sd启动卡的bug
  4. 数据库 查询XML XQuery
  5. 【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件
  6. 【kubernetes系列】Pod篇实战操作
  7. 天津理工大学计算机工程学院院长,王法玉
  8. bs架构在php哪个文件里,ThinkPHP开发之目录部署
  9. 输入n种口味随机输出四种不同的口味!
  10. 使用DOM动态创建标签