new 命令的原理

前言

以前一直没彻底弄清楚js原型链和继承,有时候是本身的理解,有时候靠死记;最近要回头看看js的基础,顺便记录一些内容。摘抄于阮一峰大神;若是想好好复习一下js基础内容,戳这里https://wangdoc.com/javascrip...javascript

使用new命令时,它后面的函数依次执行下面的步骤。

1.建立一个空对象,做为将要返回的对象实例.
2.将这个空对象的原型,指向构造函数的prototype属性。
3.将这个空对象赋值给函数内部的this关键字。
4.开始执行构造函数内部的代码html

也就是说,构造函数内部,this指的是一个新生成的空对象,全部针对this的操做,都会发生在这个空对象上。构造函数之因此叫“构造函数”,就是说这个函数的目的,就是操做一个空对象(即this对象),将其“构造”为须要的样子。java

若是构造函数内部有return语句,并且return后面跟着一个对象,new命令会返回return语句指定的对象;不然,就会无论return语句,返回this对象。数组

var Vehicle = function () {
  this.price = 1000;
  return 1000;
};

(new Vehicle()) === 1000
// false

new命令简化的内部流程,能够用下面的代码表示。

function _new(/* 构造函数 */ constructor, /* 构造函数参数 */ params) {
  // 将 arguments 对象转为数组
  var args = [].slice.call(arguments);
  // 取出构造函数
  var constructor = args.shift();
  // 建立一个空对象,继承构造函数的 prototype 属性
  var context = Object.create(constructor.prototype);
  // 执行构造函数
  var result = constructor.apply(context, args);
  // 若是返回结果是对象,就直接返回,不然返回 context 对象
  return (typeof result === 'object' && result != null) ? result : context;
}

// 实例
var actor = _new(Person, '张三', 28);
相关文章
相关标签/搜索