typeof bar === "object" 有哪些弊端?
typeof {} === "object";
typeof [] === "object";
typeof null === "object";
可以使用 Object.prototype.toStirng.call(bar) == "[object Object]";
延伸: object.prototype 原型和原型链
原型:
在JavaScript中所有对象都是Object的实例,都继承Object的属性和方法。
在对象创建中会存在一个原型对象prototype,在普通对象中没有 但有一个__proto__;
也就是说在function中跟 new 创建的对象有一个本质的区别, function中有prototype , new生产的对象没有,有__proto__
var fn = new Object();
console.log(fn.prototype); //undefined
console.log(fn.__proto__); //Object
============>
var fn = function(){};
var fn1 = new fn();
console.log(fn1.__proto__ === fn.prototype) //ture;
原型链
那么__proto__是什么? 每个对象在其内容初始化一个属性 __proto__
Object 的本质函数对象 就是 Function.prototype : Object.__proto__ === Function.prototype
Function也是函数对象 Function.__proto__ === Function prototype
Object.prototype也有一个__proto__属性,但毕竟特殊 为 null : Object.prototype.__proto__ === null;
当访问一个对象的属性时,当对象自身不存在就会通过 __proto__进行查找这个__proto__又会有自己的__proto__,
直到找到位置,这就是原乡链;
var fn = function(){};
fn.prototype.name = function(){
console.log("我是name")
}
var fn1 = new fn();
fn1.name();
解释 Function instanceof Object //true Object instanceof Function
instanceof 就是检测 一个对象是不是另一个对象 new 出来的
L instanceof B ==> L.__proto__.__proto__ ...... __proto__ === B.prototype
(也就是左侧对象__proto__链上是否有 右侧对象的prototype);
从图中可以看出
Function.__proto__.__proto__ === Object.prototype
Object.__proto__ === Function.prototype
总之记住两点:
1、所有构造器的constructor 都指向 Function
2、Function.prototype 指向一个特殊的匿名函数,而这个特殊的匿名函数的__proto__指向 Object.prototype
那么 function(){} 跟 new Object{} 是什么关系
从上图可以得出
(function(){}).__proto__.__proto__ 指向 Object.prototype
new Object().__proto__ 也指向 Object.prototype
所以 (function(){}).__proto__.proto__ === new Object().__proto__
也就是说
(function(){}) instanceof Object //true
new Object() instanceof Object //true