new和instanceof
new
代码例子
var Func=function(){};var func=new Func ();复制代码
new
共经过4个阶段
- 创建一个空对象
- 设置原型链
- 让
Func
中的this
指向obj
,并执行Func
的函数体。 - 判断Func的返回值类型,如果是基本值类型,返回obj;如果是引用类型,就返回这个引用类型的对象。 模拟实现
new
function create() { // 创建一个空的对象 let obj = new Object() // 获得构造函数 let Con = [].shift.call(arguments) // 链接到原型 obj.__proto__ = Con.prototype // 绑定 this,执行构造函数 let result = Con.apply(obj, arguments) // 确保 new 出来的是个对象 return typeof result === 'object' ? result : obj}复制代码
instanceof
instanceof运算符用于判断一个对象的原型链是否存在一个构造函数的prototype属性。
语法:object instanceof constructor 参数:object(要检测的对象) constructor(某个构造函数) 描述:instanceof运算符用来检测constructor.prototype是否存在于参数object的原型链上
下面通过代码阐述instanceof
的内部机制,假设有x instanceof y
一条语句,则其内部实际做了如下判断:
while(x.__proto__!==null) { if(x.__proto__===y.prototype) { return true; break; } x.__proto__ = x.__proto__.proto__;}if(x.__proto__==null) { return false;}复制代码
x
会一直沿着隐式原型链__proto__
向上查找直到x.__proto__.__proto__...===y.prototype
为止,如果找到则返回true
,即x
为y
的实例,否则返回false
,x
不是y
的实例。
相关面试题
function F() {}function O() {}O.prototype = new F();var obj = new O();console.log(obj instanceof O); // trueconsole.log(obj instanceof F); // trueconsole.log(obj.__proto__ === O.prototype); // trueconsole.log(obj.__proto__.__proto__ === F.prototype); // true复制代码
根据new
的内部机制改写代码
function F() {}function O() {}var obj = (function () { var obj1 = {}; obj1.__proto__ = F.prototype; // new F(); O.prototype = obj1; // O.prototype = new F(); obj.__proto__ = O.prototype; // new O(); obj.__proto__ = obj1; return obj;})()复制代码
如果改一下代码顺序,结果将不同
function F() {}function O() {}var obj = new O();O.prototype = new F();console.log(obj instanceof O); // falseconsole.log(obj instanceof F); // falseconsole.log(obj.__proto__ === O.prototype); // falseconsole.log(obj.__proto__.__proto__ === F.prototype); // false复制代码
关于原型链的详解后续文章会讲到