关键字new

关于new操作符,我们最常看到的代码像这样:

var obj = new Base();

new操作符具体干了什么呢?我们可以用代码模拟它的行为。

var obj = (function () {
  var temp  = {};
  temp.__proto__ = Base.prototype;
  var result = Base.call(temp);
  return typeof result === 'object'? result : temp;
})();
  1. 创建了一个空对象obj。
  2. 将这个空对象的__proto__成员指向了Base函数对象prototype成员对象。
  3. 将Base函数对象的this指针替换成obj,然后再调用Base函数。
  4. 判断result的类型,返回结果。

下面通过一些例子来理解

在没有return的情况下
function A() {
  this.a = 'a';
}
var a = new A();
console.log(a); //A {a: "a"}
console.log(a.__proto__.constructor); //ƒ A() {this.a = 'a';}

function B() {
  var b = 'b'
}
var b = new B();
console.log(b); //B {}
console.log(b.__proto__.constructor); //ƒ B() {var b = 'b'}

由以上的结果可以分析出

  1. 实例的constructo都指向构造函数。
在有return的情况下
function C() {
  return 'c';
}
var c = new C();
console.log(c); //C {}
console.log(c.__proto__.constructor);//ƒ C() {return 'c';}


function D() {
  return {
    d: 'd'
  };
}
var d = new D();
console.log(d); //{d: "d"}
console.log(d.__proto__.constructor);//ƒ Object() { [native code] }

function E() {
  return function () {
    this.e = 'e';
  }
}
var e = new E();
console.log(e); //ƒ () {this.e = 'e';}
console.log(e.__proto__.constructor);//ƒ Function() { [native code] }

function F() {
  this.f = 'f';
  return {
    f: 'f-1'
  }
}
var f = new F();
console.log(f); //{f: "f-1"}
console.log(f.__proto__.constructor);//ƒ Object() { [native code] }


function G() {
  return gv;
}
var g = new G();
console.log(gv === g); //true

由以上的结果可以分析出

  1. 正如编辑器webstorm的提示语(Primitive value returned from constructor will be lost when called with 'new')所说的一样, 如果return的是一个基本类型的值,那么值会消失,new出来的实例就是一个空对象,实例的constructor指向构造函数。
  2. 如果return的是一个引用类型的值,那么new出来的实例就是就是return的值的本身,实例的constructor指向值的constructor。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,954评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,461评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,842评论 0 9
  • 对这句话的理解是:客户始终是第一位。任何人都可以成为公司运营发展的客户。 服务好所有客户(包括潜在,客户背后客户,...
    妙子H阅读 2,795评论 0 0
  • 小六啊小六,今天是你失而复得的第一天。我想饿你半天。好让你知道除了我,你吃不了饭。以后再飘走,别人打电话,我也不去...
    小王很厉害阅读 1,215评论 0 0