原型链
创建对象的集中方法
第一类:字面量
var o1={name:'o1'}
var o11=new Object({name:'o11'})
第二类:构造函数
var M=function(){this.name='o2'}
var o2=new M()
第三类:Object.create()
var P={name:'o3'}
var o3=Object.create(P)
原型、构造函数、实例、原型链
在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype
属性,这个属性指向函数的原型对象。原型对象,顾名思义,它就是一个普通对象。
instanceof的原理
用于测试构造函数的 prototype 属性是否出现在对象原型链中的任何位置
简单实现
function new_instance_of(obj, typeObject) {
let rightProto = typeObject.prototype; // 取类型对象的 prototype 值
obj = obj.__proto__; // 取对象的__proto__值
while (true) {
if (obj === null) {
return false;
}
if (obj === rightProto) {
return true;
}
obj = obj.__proto__
}
}
new运算符
-
一个新对象被创建。它继承自foo.prototype
-
构造函数foo被执行,执行的时候,相应的参数会被传入,同时上下文(this)会被指定为这个新实例,new foo等同于new foo(),只能用在不传递任何参数的情况下
-
如果构造函数返回了一个对象,那么这个对象会取代new出来的结果,如果函数没有返回对象,那么new出来的结果为步骤一创建的对象