Js中的new原理及其实现

更新日期: 2020-05-08阅读: 1.7k标签: new

前几天遇到一个有趣的问题,代码如下:

function Person(){
  this.age = 0;
  setInterval(() => {
    this.age++;
  }, 1000);
}
var p = new Person();

运行起来会发现p值是一个动态改变的对象,那么它是怎么做到的呢?下面一起来看看:

// 直接运行Person方法并打印当前this对象
function Person(){
  this.age = 0;
  setInterval(() => {
    this.age++;
    console.log(this);
  }, 1000);
}
Person();
// 打印的结果是window对象

上面的代码我们直接运行了Person方法,发现此时打印的是window对象,原因是函数在调用的时候函数的this指向window,下面我们看一下通过new Person()运行的结果如何:

// 通过new Person()方式调用
function Person(){
  this.age = 0;
  // 这里不用箭头函数最后会指向window对象
  setInterval(() => {
    this.age++;
    console.log(this);
  }, 1000);
}
var p = new Person();
// 打印的结果是当前的p对象

运行上面的代码会发现打印了当前的p对象,不难看出,new语法改变了我们调用函数时候的this指向,并返回了执行后的this对象,那么它是怎么做到的呢?我们可以用一个简单的实现解释一下其原理:

function Person(age) {
  this.age = age;  
}
Person.prototype.sayAge = function () {
  console.log(this.age);
}
function createNew (target, ...argArr) {
  // 判断类型
  if (Object.prototype.toString.call(target).slice(8, -1) !== ‘Function‘) return;
  // 以构造器的prototype属性为原型,创建新对象;
  var source = Object.create(target.prototype);
  // 在source上执行target内容
  target.apply(source, argArr);
  // 返回执行后的source
  return source;  
}
var p = createNew(Person, 18);
console.log(p.age);
p.sayAge && p.sayAge();
// 打印结果为
// 18
// 18

另一种解释方式是:

var p = {};
p._ptoto_ = Person.prototype;
Person.apply(p, 18);

Over,自行理解吧~


链接: https://www.fly63.com/article/detial/9414

new.target属性_你可能不知道的 new.target

new 是构造函数生成实例的命令, ES6为 new 命令引入了 new.target属性。这个属性用于确定构造函数是怎么调用的。在构造函数中, 如果一个构造函数不是通过 new操作符调用的, new.target会返回 undefined。

new 操作符 做了什么?

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。假设Test是一个构造函数,通常在创建对象的实例时,要使用new,eg:test = new Test() , 那么在调用new的时候,发生了什么呢?

JS中的new操作符原理解析

1. 创建一个类的实例:创建一个空对象obj,然后把这个空对象的__proto__设置为Person.prototype(即构造函数的prototype);2. 初始化实例:构造函数Person被传入参数并调用,关键字this被设定指向该实例obj;3. 返回实例obj。

JS深度解析 new 原理及模拟实现

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 ——(来自于MDN)new 创建的实例有以下 2 个特性:1、访问到构造函数里的属性;2、访问到原型里的属性

“写”一个js的new运算符

new 运算符 创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。比较好奇new运算符的原理,了解了下,分享给大家。自己写一个New()方法,

JS中new操作符源码实现

首先我们来看一下实例化一个对象做了浏览器做了什么事情,new的四步操作:1. 创建一个空对象2. 设置空对象的__proto__属性继承构造函数的prototype属性,也就是继承构造函数的原型对象上的公有属性和方法

你知道多少this,new,bind,call,apply?

那么什么是this,new,bind,call,apply呢?这些你都用过吗?掌握这些内容都是基础中的基础了。如果你不了解,那还不赶快去复习复习,上网查阅资料啥的!通过call,apply,bind可以改变this的指向

Js中new操作符的详细过程

理解new对象过程,需要提前了解原型及原型链的相关知识;我们都知道,JS当中创建对象使用的是原型设计模式,即使用new操作符调用构造函数,这里先看一个例子:

js之new的原理

对于创建一个对象来说,更推荐使用字面量的方式创建对象(无论性能上还是可读性)。因为你使用 new Object() 的方式创建对象需要通过作用域链一层层找到 Object

JS中NEW的实现原理及重写

上面的代码,我们首先创建了一个函数,如果是用面向对象的说法就是创建了一个Function类的实例,如果直接执行这个函数,那它就是一个普通的函数,如果用new执行,则这个函数被称为一个自定义的类。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!