深入理解javascript中的原型和闭包之一

通过几个结论来梳理今天的文章

一、一切都是对象

javascript中存在值类型(undefined, number, string, boolean)和引用类型函数、数组、对象、null、new Number(10)两种,引用类型的都是对象。tyoeof [1,2,3]  //object。引用类型的类型判断,用instanceof。

对象是若干属性的集合,javascript中的对象可以任意的扩展属性。

二、对象都是函数创建的

function Fn() {
            this.name = 'aaa';
            this.year = 2010;
        }
var fn1 = new Fn();

这种方法是在用函数创建对象

var obj = { a: 10, b: 20 };
这种方法其实是一种语法糖,
var obj = new Object();
        obj.a = 10;
        obj.b = 20; 同样是在用函数创建对象。对象都是通过函数创建的。 

三、每个函数都有一个prototype属性,属性的值是一个对象,默认只有一个constructor指向函数本身

        function Fn() { }
        Fn.prototype.name = '小名';
        Fn.prototype.getYear = function () {
            return 1988;
        };

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

这一项应该简单理解,fn->prototype->{constructor:fn}。其实就是一个链状结构。

四、每个对象都有一个__proto__属性,隐式原型

var obj={};

obj.__proto__=== Object.prototype

每个对象都有一个__proto__属性,指向创建该对象的函数的prototype

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

五、instanceof表示的就是一种继承关系,或者原型链的结构

综上所述,整理一下思路。

引用类型都是对象,对象是属性的集合。对象都是由函数创建出来的。每个函数都有一个prototype的属性,prototype属性的值是一个对象。这个对象有个constructor属性指向创建这个对象的函数。每个对象又都有个__proto__属性,这个属性指向创建该对象的函数的prototype。可以用instanceof来判断对象之间是否存在引用关系。

随机浏览