资讯专栏INFORMATION COLUMN

new命令的原理

Kyxy / 1625人阅读

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

var person = new Person("小明", 18);
console.log(person.name);  //小明
console.log(person.age);   //18

执行new命令会经过以下几个步骤

创建一个空对象,这个对象将会是new Person()返回的对象实例;

将这个空对象的原型指向构造函数prototype属性;

构造函数this指向空对象,并运行构造函数;

判断构造函数返回的是不是对象,是的话返回默认对象,不是的话返回之前创建的空对象,没有返回值默认返回空对象

用代码解释一下
function Person(name, age) {
    this.name = name;
    this.age = age
    //return "小明" //如果返回的不是Object类型,将忽略这个return 返回之前创建的空对象
   /* return {     //如果返回的是Object类型,直接返回这个对象
        "name" : "小花",
        "age" : 22
    } */
}

function _new(person, ...rest){
    var obj = {};  // 创建一个空对象,这个对象将会是返回的对象实例
    obj.__prototype__ = person.prototype; // 将这个空对象的原型指向person的prototype属性;
    //上述两步可以合为一步 :  var obj = Object.create(person.prototype)  
   
    var res = person.apply(obj, rest);  // 将person的this指向空对象,并运行person函数,apply命令绑定this后就会运行person
    return (typeof res === "object" && res != null) ? res: obj;
    // 判断res返回的是不是对象,是的话返res,不是的话返回之前创建的obj,没有返回值默认返回obj
}

var xiaoming = _new(Person, "小明", 15)
console.log(xiaoming .name);  //小明
console.log(xiaoming .age);   //15

本篇如能对您有所帮助,实在是感到荣幸。如有不合理之处也请大家多多指点。

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

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

相关文章

  • new 命令原理

    摘要:创建一个空对象,作为将要返回的对象实例将这个空对象的原型,指向构造函数的属性。如果构造函数内部有语句,而且后面跟着一个对象,命令会返回语句指定的对象否则,就会不管语句,返回对象。 前言 之前一直没完全弄清楚js原型链和继承,有时候是自己的理解,有时候靠死记;最近要回头看看js的基础,顺便记录一些内容。摘抄于阮一峰大神;如果想好好复习一下js基础内容,戳这里https://wangdoc...

    aikin 评论0 收藏0
  • JavaScript学习之Object(下)new命令

    摘要:命令作用作用是执行构造函数,返回实例对象上面例子是自定义一个构造函数,其最大的特点就是首字母大写,用执行构造函数其中,在的执行下,代表了实例化后的对象,这个也就有属性注意点如果不用执行构造函数,那么指向的是全局有两种方式可以避免内部定义严格 new命令 new作用 作用是执行构造函数,返回实例对象 function F() { this.name = object } var ...

    Salamander 评论0 收藏0
  • Java 编译器 javac 笔记:javac API、注解处理 API 与 Lombok 原理

    摘要:对语法树的扫描,同样提供了扫描器。词法分析过程如下图所示语法分析,即根据语法由序列生成抽象语法树,对应实现类为。生成的抽象语法树如下图所示的实现原理依赖开发的典型的第三方库有,代码自动生成的和,代码检查的和,编译阶段完成依赖注入的等。 原文:http://nullwy.me/2017/04/java...如果觉得我的文章对你有用,请随意赞赏 javac 是 Java 代码的编译器 [...

    lookSomeone 评论0 收藏0
  • FE.BASE-vscode使用、原理、插件开发笔记

    摘要:插件提供内容,负责渲染。增量更新,尽可能地减少重新渲染长时间运行的任务应该支持,并可以取消插件能够正确地处理对象的生命周期。使用了模式,运行可以将这个对象销毁。 使用 命令行使用 帮助:code --help 使用已经打开的窗口来打开文件:code -r 打开文件并滚动到特定行:code -r -g package.json:128 比较两个文件:code -r -d a.tx...

    MingjunYang 评论0 收藏0

发表评论

0条评论

Kyxy

|高级讲师

TA的文章

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