JavaScript原型及原型链理解

         参考链接:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

        JavaScript是一种基于对象的语言,什么叫基于对象呢?也就是什么东西都是对象,而没有类(class)这种概念。

        而面向对象编程的编程思想。就是把万物都抽象成一个个对象,它并不在乎数据的类型以及内容,它在乎的是某个或者某种数据能够做什么,并且把数据和数据的行为封装在一起,构建出一个对象,而程序世界就是由这样的一个个对象构成。而类是一种设计模式,用来更好地创建对象。

        那么JavaScript既然没有类的概念(现在ES6已加入这种概念),那么如何去创造对象呢?刚才说过在面向对象编程里面可以定义类(class)然后再生成对象,那么除了定义类去生成对象,还有以下方法:

        (1)工厂模式

        (2)构造函数模式

            随着JavaScript的发展,这种模式渐渐被更简洁的构造函数模式取代了,下面是构造函数模式的例子:

function Dog(name, age, job){
    this.name = name;
    this.age = age;
    this.getName = function(){
        return this.name;
    }
}
var dog = new Dog()

       注:下面这种创建对象的方法其实属于语法糖,本质和上面一样(或者是js里面的new操作符,后面再说)

var obj = { a: 10, b: 20 };

        这里开始说原型的事,由于JavaScript一切都是对象,没有"类"的概念,那也就不能像传统面向对象编程那样继承,那JavaScript如何去实现继承呢?如上述Dog的例子,如果我需要一个相似的Cat对象,如下:

function Cat(name, age, job){
    this.name = name;
    this.age = age;
    this.getName = function(){
        return this.name;
    }
}
var cat = new Cat()
         说在传统的面向对象编程里面,这两个对象其实可以归结为一个Animal类,但是JavaScript怎么去继承呢?所以JavaScript里面引入了"原型"的概念(原型有点父类的味道?),即定义一个Function对象时,每个Function对象都自带一个属性prototype指向原型对象(只有Function对象才有prototype属性,普通对象利用_proto_属性指向原型),然后原型对象又有_proto_属性指向上一级原型。。。。最后指向object时,object指向null,如上述例子,想在cat和dog对象里添加一个eat属性,可以在原型里添加,然后js解释器会沿着这条原型链往上找,知道找到eat为止。说完原型,原型链也就比较容易理解了。看下图,有种类继承的感觉有没有?

        JavaScript原型及原型链理解_第1张图片

        

你可能感兴趣的:(JavaScript原型及原型链理解)