JavaScript中new了一个对象,发生了什么?

JavaScript一直强调没有类的概念,但是JavaScript中我们也经常需要new一个对象。

new是一个运算符,用来调用函数(js中函数可以作为普通函数被调用做方法,也可以通过new来调用作为一个构造器)

function Person(name){
  this.name = name  
}

let p = new Person('Jay')

其实,在JavaScript中任何对象通过构造器(例如Person)的创建。实际上是克隆了一个Object.prototype空对象(js根对象)。

克隆一个Object.prototype对象后,初始化将新对象的原型指向Object.prototype。

事实上,除了根对象Object.prototype。任何一个对象都有一个原型。

像下面这样常见的创建对象方式,在JavaScript引擎内部,都是进行同样的操作 —— 克隆

let obj1 = {}

let obj2 = new Object()

那么在原型链中的操作:

let sport = {
    category: 'ball'    
}

function Tennis(){}

Tennis.prototype = sport

let t = new Tennis()

主要步骤有两点:

  • 克隆一个 js 的 Object.prototype 对象 t
  • 将 t 的原型指向它的构造器(Tennis)原型,sport —— " t.__proto__ = Tennis.prototype "

最后补充一点,构造器函数中有两句语句被隐式执行了,上面的Tennis中

function Tennis(){
    let this = {
        __proto__: Tennis.prototype
    }
    // .....
    // let this.xxx = xxx
    // .....
    return this    
}

 

posted @ 2019-03-12 11:56  _JayKoo  阅读(3842)  评论(0编辑  收藏  举报