使用New运算符,实例化一个对象,都做了那些事情?
面试时被问到这个问题,虽然自己有自己的理解,但是感觉回答的不是很好,查阅了一下网上的资料,总结一下。
因为js对象都是相互关联的,也就是说,即使是一个空的对象,他的__proto__
属性是指向Object的prototype
。
当我们使用new
这个关键字来实例化一个对象时,要注意,new
后面必须要是一个对象,并且这个对象要有一个名为construct
的方法。首先我们可以模拟一下new的过程,我们写这样一个类:
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype = {
walk:function(){
console.log("This is a 'walk' method!")
}
}
//构造一个伪construct方法:
Person.construct = function(){
var o,Constructor = Person;
o.__proto__ = Person.prototype;
Constructor.apply(o,arguments);
return o;
}
var person = new Person('Bill',18);
如上代码,我们构造了一个伪construct
方法,当我们在使用new
关键字实例化某个类对象时,首先会触发这个类(其实也是对象,我们称他为一个类)的construct
方法。
在这个方法中,我们首先创建了以个空的对象o
,并且我们拿到了我们的类(对象)的引用Constructor
。
接着我们将我们创建的空对象的__proto__
指向我们的类的prototype
,这样,我们首先实现了基于原型链的继承,接着使用apply方法,让o
去调用Person方法,初始化了o
的name
和age
属性,最后将o
返回给我们创建的person变量。
至此,new
的过程就结束了。person对象拥有两个自有属性name
和age
,以及一个继承的方法walk
。