JS概念理解(一)——函数和对象、原型链、_proto_

        最近发现自己JS的基础不太好,于是通过看书和大神的博客,通过自己的理解将一些难懂的概念在此总结:

        1.函数和对象的关系:

        在JavaScript中一切对象都是通过函数创建的,某些情况下的写法实际上是一种语法糖:

var a = {b : 20, c: 30};
var arr = [ 5 , "as", true];
//可以写成
var a = new Object();
a.b = 20;
a.c = 30;

var arr = new Array();
arr[0] = 5;
arr[1] = "as";
arr[2] = true;
        上面这两种写法实际上可以互相替换,我们经常使用的上面这种写法,因为更加简便,可读性更高,但是我们需要明白它们实际上也是通过函数创建的。

        2.Prototype原型链:

        在Java这类强类型语言当中,类在被创建好之后不允许再次添加其中的方法和属性,就像是盖印章,盖下去是什么就没法改变了。而在JavaScript中,由于它是弱类型语言,可以随时在程序中改变类中的方法和属性。

var aa = {a:10 , b:true};
console.log(aa.toString());   //结果:[object Object]
var bb = [ 10,20];
console.log(bb.toString());   //结果:10,20
        从上面的代码段可以看出来,由于它们的对象类型不同,结果也大不一样,是Array对象对Array.prototype.toString()进行了重载。

        如果我们想实现重载,也很简单只需要在继承的子类的prototype中修改父类的方法就可以了,因为原型链是一个链式结构,当子类需要一个方法时他总是会先去找自己的类中有没有该方法,如果没有在去父类中寻找。

function People() {
    this.name = "srk";
    this.age = 100;
}
People.prototype.speak = function () {
    console.log("hello person");
};

function Student() {}
Student.prototype = new People();   //实现继承
Student.prototype.speak = function () {
    console.log("hello student");
};
var p1 = new People();
var p2 = new Student();
p1.speak();//hello person
p2.speak(); //hello student
最后再放一幅图,很能说明JS原型链继承的特点:

JS概念理解(一)——函数和对象、原型链、_proto_

        3._proto_隐式原型

        每个对象都拥有一个隐藏属性_proto_,该属性引用了创建这个对象的函数的prototype,还用上个例子的代码来说的话,p1._proto_ === People.prototype,关系如图所示:
JS概念理解(一)——函数和对象、原型链、_proto_
        在这个图当中,o1的_proto_指向了Object.prototype,因为它实际上就是一个Object对象,然而Object.prototype也拥有一个_proto_属性,这个值为null。总而言之就是:对象的_proto_指向创建它的函数的prototype。