JavaScript面试——new关键字都干了什么?

一、构造函数

二、new命令

三、Object.create()


一、构造函数

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

构造函数是一个函数名的首字母大写的普通的函数,但他与普通函数相比有两个不同:

(1)函数体内部使用this关键字,代表了所要生成的对象实例

(2)生成对象的时候,必须使用new命令

二、new命令

var v = new Vehicle();

var v = new Vehicle(200); //如果Vehicle函数有形参时

new命令的原理

当使用new命令时,它后面的构造函数依次执行,

(1)创建一个空对象,作为将要返回的对象实例

(2)将这个对象的原型指向构造函数的prototype属性

(3)将这个对象赋值给构造函数内部的this关键字

(4)开始执行构造函数内部的代码

源码实现

//new Foo(args) <=> myNew(Foo, args)
function myNew (Foo, ...args) {
    let obj = Object.create(Foo.prototype); //相当于obj.__proto__ = Foo.prototype
    let res = Foo.apply(obj, args); //执行构造函数并绑定this
    //构造函数return对象,则返回该对象,否则返回obj
    return Object.prototype.toString.call(res) === '[object Object]' ? res:obj;
}

三、Object.create()

以一个对象作为参数,然后以它为原型,返回一个实例对象 new_obj.prototype === obj,而new的原型链是 new_obj.__proto__ === Foo.prototype

var obj = {
    name:'Mark',
    age:17
};
var new_obj = Object.create(obj);
console.log(Object.getPrototypeOf(new_obj) === obj); //true

该实例完全继承原型对象的属性。

 

参考资料:

1. 实例对象与 new 命令-阮一峰

猜你喜欢

转载自blog.csdn.net/huaf_liu/article/details/115438191