博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实例化对象的过程
阅读量:5275 次
发布时间:2019-06-14

本文共 1084 字,大约阅读时间需要 3 分钟。

  在JS中,对象的创建方式有许多种,new Objec、字面量、构造函数等等,在ES6中提供了采用class关键字来创建对象的方式,这些林林种种的写法各有优劣,但是追根究底都是采用new Object的方式来创建的。Object是JS的内置对象,也是所有对象的起源,那么为什么new一个Object得到的就得到个对象呢?这里使用一个更复杂的例子来说明这个问题。

class Car {    constructor(name, speed, price) {        this.name = name;        this.speed = speed;        this.price = price;    }    addSpeed(_speed) {        return this.speed + _speed;    }    }

 

   上面通过ES6提供的class关键字创建了一个名为Car的类,并且定义了属于这个类的名字、速度和价格的属性,这个类还提供了加速的方法。在class关键字的作用范围内,this指向这个类的原型,所以在其中定义的方法,是属于原型对象的方法,实例化的对象都具有共同的方法。在constructor构造器函数中,this指向构造器,也就是构造函数,在构造器中定义的属性属于实例化对象自身的属性。

let bmw = new Car("bmw", 60, 200000);

 

   代码执行遇到new,首先通过Object创建一个空对象。

  然后修改这个空对象的__proto__使其指向构造函数的prototype,那么现在空对象的__proto__指向了addSpeed()方法所在的地方,创建的空对象就能够调用这个方法。

  改变类的构造器函数中this的值,现在this的值是刚才创建的空对象。然后执行构造器函数中的代码,传递的实参就是这个新创建对象的属性。

  构造器函数运行完成后,会默认实例化对象赋值符号后面的等式有一个返回值,这个返回值就是这个对象整体,然后执行赋值运算,声明的bmw就是一个新的属于Car的对象。

 

  由于在创建过程中先修改空对象的__proto__,然后再执行构造器函数,所以在constructor中调用class中定义的方法是能够执行的。

  如果在构造器函数中return了一个值,那么采用new创建对象,构造函数执行完成后返回的就不是整体对象,而是return的值。

转载于:https://www.cnblogs.com/zzmiaow/p/8094019.html

你可能感兴趣的文章
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>
rotate the clock
查看>>
bugku 变量
查看>>