美文网首页
new操作符详解

new操作符详解

作者: AndreaH | 来源:发表于2019-11-27 14:47 被阅读0次

首先先来段我们熟悉的代码

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.say = function(){
    console.log('i can speak');
}

let girl = new Person('weboof', 18);

console.log(girl.name);
console.log(girl.age);
girl.say();

这是我们经常看到并且常用的代码由此可以看出通过new创建出来的实例有以下几个特征:

  • new通过构造函数Person创造出来的实例可以访问构造函数中定义的属性和方法。
  • new通过构造函数Person创造出来的实例可以访问构造函数原型上的属性和方法。

接下来按照以上总结内容我们试着自己实现以下new操作符。首先我们需要了解以下几个问题点:

  • 如何让实例和构造函数产生关系如何实现属性和方法的继承?
  • 如何让实例和构造函数的原型产生关联?

简易版

function creat(Construction, ...args){
    let obj = {};
    Construction.call(obj, ...args);  //继承构造函数内部属性和方法
    //Construction.apply(obj, args);  //继承构造函数内部属性和方法
    Object.setPrototypeOf(obj, Construction.prototype); //连接原型
    return obj;
}

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.say = function(){
    console.log('i can speak');
}

let girl = creat(Person, 'weboof', 18);

console.log(girl.name); //weboof
console.log(girl.age); //18
girl.say(); // i can speak

我们看到以上方法已经可以实现一个简易的new操作符了。接下来我们还需要讨论一下当构造函数有返回值时 会出现什么情况?

构造函数返回原始类型

function Person(name, age) {
    this.name = name;
    this.age = age;
    return 1
}
Person.prototype.say = function(){
    console.log('i can speak');
}

let girl = new Person('weboof', 18);

console.log(girl.name); //weboof
console.log(girl.age); //18
girl.say(); //i can speak

由此我们可以看出如果构造函数返回值为原始类型时对于创建出来的实例不会有任何影响。

构造函数返回对象类型

function Person(name, age) {
    this.name = name;
    this.age = age;
    return {
        name: 'hanhh'
    }
}
Person.prototype.say = function(){
    console.log('i can speak');
}

let girl = new Person('weboof', 18);

console.log(girl.name); //hanhh
console.log(girl.age); //undefined
girl.say(); //VM267:17 Uncaught TypeError: girl.say is not a function

由此可以看出如果构造函数返回的值为对象类型通过构造函数创建出的实例是会受到返回值的影响并且不会继承构造函数原型链上的属性和方法。

完整代码如下

function creat(con, ...args) {
  //con为传进来的构造函数
  let obj = {};
  //obj可以访问构造函数上面的属性和方法
  // let result = con.call(obj, ...args);
  let result = con.apply(obj, args);
  if(result instanceof Object) {
    return result;
  }else {
    Object.setPrototypeOf(obj, con.prototype); //obj可以访问构造函数原型链上的属性
    return obj;
  }
}

以上就是对new操作符的详细解释,希望对你有帮助~

相关文章

  • new操作符详解

    首先先来段我们熟悉的代码 这是我们经常看到并且常用的代码,由此可以看出通过new创建出来的实例有以下几个特征: n...

  • JavaScript深入理解-new关键字创建对象底层原理

    JavaScript中 new 操作符可以通过构造函数创建对象,但是其底层原理大多人都不太清楚,下面我们来详解一下...

  • JS基础回归01:new操作符,原型和原型链

    本篇介绍 new 操作符的背后原理以及 JS 如何依赖原型形成原型链,完成继承。 new 操作符的本质 new 操...

  • js中的new关键字都干了些什么?

    new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new...

  • new

    什么是new操作符 new会生成一个实例对象,该对象的this指向该实例 实现一个new操作符

  • 关于 C++ 里的 New

    new expression : new 表达式 operator new : 操作符函数,用来分配内存. ...

  • c++_动态对象创建

    一.c语言 c语言使用malloc 来创建堆对象 二.c++ new操作符 delete操作符 如果new []...

  • new 对象 class

    new 操作符具体干了什么? 当我们new一个数据的时候,new操作符到底做了什么? 首先是创建实例对象{},th...

  • 关于 new 操作符

    1. 为什么要有new操作符? JS 的 new 到底是干什么的? 本文指出,new 操作符其实就是个语法糖,用了...

  • Rxjava---操作符篇---组合 / 合并操作符

    原文链接:Android RxJava操作符详解 系列:组合 / 合并操作符Android RxJava 实战系列...

网友评论

      本文标题:new操作符详解

      本文链接:https://www.haomeiwen.com/subject/kqspwctx.html