对象new的流程
当我们使用new关键字时,我们就创建了一个对象。比如new Date();
那么,创建对象的流程是怎样呢?
- 1.如同是用{}创建对象一样,js创建了一个类似的空对象。
- 2.然后针对该对象调用指定的构造函数,这里就是Date了,构造函数的this即指向该空对象,构造函数给该对象添加了属性和方法。(构造函数一般不会有返回值)。这个新对象就是整个对象创建表达式的返回值。
——构造函数给对象添加属性和方法?那原型干什么,实例对象不是都继承了原型吗,原型没有对实例对象做点什么吗?创建实例对象时,实例对象的[[Prototype]]
属性会指向构造函数的原型,所以是通过这种方式继承原型的。 - 3.如果构造函数返回了一个对象呢,那么该对象为整个对象创建表达式的返回值。并且最初的{}对象废弃掉。(jquery对象就是用这种方式创建,我们使用jquery就不需要使用new jQuery了)。
——注意:此时创建的对象将不是该构造函数的实例。即:
function A() {
this.name = "abc";
return {
xingming:"bbc";
}
}
var a = new A();
a instanceof A;//false
A.prototype.isPrototypeOf(a);//false
new + function
创建对象时new的肯定是构造函数了,是函数。
创建对象时,会将对象的[[Prototype]]
内置属性指向,构造函数的原型(prototype)。
实际上:a instanceof b;判断a对象是否是b构造函数的实例 的内部过程是:判断a中 [[Prototype]]
所指向的是否是构造函数b的prototype(原型)。所以,类(采用其他oop语言的说法)的真实的唯一的标识是构造函数的原型。