【深刻理解javascript】原型

一、一切都是对象html

一切(引用类型)都是对象,对象是属性的集合数组

typeof函数输出的一共有几种类型,在此列出:函数

       function show(x) {

            console.log(typeof(x));    // undefined
            console.log(typeof(10));   // number
            console.log(typeof('abc')); // string
            console.log(typeof(true));  // boolean

            console.log(typeof(function () { }));  //function

            console.log(typeof([1, 'a', true]));  //object
            console.log(typeof ({ a: 10, b: 20 }));  //object
            console.log(typeof (null));  //object
            console.log(typeof (new Number(10)));  //object
        }
        show();
以上代码列出了typeof输出的集中类型标识,其中上面的四种(undefined, number, string, boolean)属于简单的值类型,不是对象。剩下的几种状况——函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。

判断一个变量是否是对象很是简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。spa

var fn = function () { };
console.log(fn instanceof Object);  // true

疑问:typeof的输出类型中,function和object都是对象,为什么却要输出两种答案呢?都叫作object不行吗?prototype

二、函数和对象的关系code

对象都是经过函数建立的。htm

疑问:对象是函数建立的,而函数却又是一种对象——天哪!函数和对象究竟是什么关系啊?对象

三、prototype原型blog

函数的prototype是一个属性,每个函数都有这么一个属性,这个prototype的属性值是一个对象,这个对象默认只有一个constructor的属性,指向这个函数自己。对象是什么来,对象是属性的集合。原型链

每一个对象都有一个隐藏的属性——“__proto__”,这个属性引用了建立这个对象的函数的prototype

如如下代码,fn是一个实例对象,Fn是一个函数,则fn.__proto__ === Fn.prototype

 function Fn() { }
        Fn.prototype.name = '王福朋';
        Fn.prototype.getYear = function () {
            return 1988;
        };

        var fn = new Fn();
        console.log(fn.name);
        console.log(fn.getYear());

总结:每一个函数function都有一个prototype,即原型。这里再加一句话——每一个对象都有一个__proto__,可成为隐式原型。

四、隐式原型(这节重点记忆)

  • 每一个对象的__proto__属性,指向建立该对象的函数的prototype。
var fn = new Foo();

fn._proto_ =  Foo.prototype //fn是由函数Foo建立的

 

  • 函数也不是从石头缝里蹦出来的,函数也是被建立出来的。谁建立了函数呢?——Function——注意这个大写的“F”

function Foo(){…}等价于var Foo = new Function(…),因此

Foo._proto_=Function.prototype //Foo是由函数Function建立的

//Object对象也是由函数Function建立的,Object=function Object(){[native code]}

Object._proto_ = Function.prototype

//Function对象也是由函数Function建立的,Function=function Function(){[native code]}

Function._proto_ = Function.prototype

//自定义函数Foo的prototype本质上就是和 var obj = {} 是同样的,都是被Object建立,因此:

Foo.prototype._proto_ = Object.prototype

//Function.prototype指向的对象也是一个普通的被Object建立的对象

Function.prototype._proto_ = Object.prototype

//Object.prototype确实一个特例——它的__proto__指向的是null,切记切记!

Object.prototype._proto_ = null

五、instanceof

Instanceof的判断队则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,若是两条线能找到同一个引用,即同一个对象,那么就返回true。若是找到终点还未重合,则返回false

六、原型链

访问一个对象的属性时,先在基本属性中查找,若是没有,再沿着__proto__这条链向上找,这就是原型链。

相关文章
相关标签/搜索