美文网首页
关键字new

关键字new

作者: 小b侠 | 来源:发表于2017-10-11 15:53 被阅读0次

关于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。

相关文章

  • C++中new、operator new和placement n

    1. new (1)C++对象实例化的时候使用new关键字和不使用new关键字的区别 使用new是动态分配内存,这...

  • Java中生成实列

    1.new 一般我们使用Java关键字new生成实例。 Something obj=new Something()...

  • JavaScript new 关键字

    new 关键字 在JavaScript中, new 关键字用来创建一个类(模拟类)的实例对象。 实例化对象之后, ...

  • Java中创建对象的四种方式

    使用new关键字创建对象 使用new关键字创建对象是最常见的一种方式,但是使用new创建对象会增加耦合度。在开发中...

  • js学习札记-new关键字

    js 的new关键字解析的过程中引擎执行了很多步骤,我们可以自己写一个仿new的函数来实现new关键字。 说js ...

  • java中的构造方法

    构造器 构造方法 Constructor 构造器的作用:1、创建对象,必须和new关键字一起使用。new关键字的作...

  • Java四种创建对象方式

    1,创建的new关键字创建对象 new HelloWorld(); 2,使用newInstance()方法 例如:...

  • js基础-new关键字

    js 的new关键字解析的过程中引擎执行了很多步骤,我们可以自己写一个仿new的函数来实现new关键字。 js n...

  • Android Studio 看不到 DexClassLoade

    关键字: DexClassLoader throw new RuntimeException("Stub!")An...

  • Java-线程状态、ObjectMonitor

    关键字:线程状态、ObjectMonitor 状态分类 (1)新建状态(NEW),执行new Thread()后的...

网友评论

      本文标题:关键字new

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