JS(原型链)

来源:互联网 发布:大阪 知乎 编辑:程序博客网 时间:2024/06/01 13:50

        在聊原型链之前多吹几句,为啥需要对象?对象的好处?在传统的开发中(也叫面向过程)。顾名思义,面向过程是你要写所有的操作代码,在这个过程中,代码重复,一旦出错或者用户修改要求,要修改的代码就很多,后期维护人员绝对累死。
        在生活中,面向过程就是,你要去买东西,你要自己亲自去买,而面向对象,就是你在家里,叫别人去买。这里的“别人”就是对象。你只知道这个对象可以给你买来东西,但买的过程,你并不需要关心。
        就像JS里面经常使用的jQuery框架,其实就是各种对象封装的。使用时我们只知道这样使用可以得到什么,但是实现过程我们并不知道。
        最初的js是没有类(抽象),对象(具体)这个概念,所以在有些方面和那些成熟的面向对象语言不同。JS里面用函数实现的对象,可以说函数即对象。就是为了实现功能而存在的。
        在JS中我们为了区分构造函数和普通函数,习惯将构造函数的首字母大写。其实这两种没有区别,既是函数又可以实现对象。只是为了代码阅读方便。

    function test() {    }    function Test() {    }    Test.prototype = {}    console.log(typeof(test))    console.log(typeof(Test))

function


JS创建对象的过程,和原型链形成

        上面图片中显示的属性都是函数自带的隐形属性。表面上是看不见,但又实际存在的。
对象创建:

       function Test() {        this.name = 'simon';        this.say = function() {            console.log('最近迷恋上ytg的简讯小哥哥了');        };    }    Test.prototype = {        answer: function() {            console.log('yeye');        }    }    var tObject = new Test();    tObject.say();
  1. 对象创建是从左到右的。 var tObject = new Test(); 首先会创建声明一个空对象, var tObject = null。
  2. 再实现 new Test(),此时会在堆内存开辟一片空间,为拷贝构造函数里面的属性。方法也可以叫属性,只是他可以实现某种功能而已。在JS中有万物皆对象,万物皆属性的说法。
    me

  3. 成生一个属性proto指向类的原型。(原型链的来源)

    object

面向对象语言里面,(new Test())实例化对象的时,一定会去调用构造函数。


原型链:
        构造函数自带:prototype和__proto__属性。两个都是存的地址。原型链的实现就是靠__proto__
        对象分两种:函数对象和原型对象。
        搜索机制:比如调用某种方法。实例化对象,先搜索自己属性是否有,有则实现代码;没有则调用自己的原型;若自己的原型有,则实现代码;没有则调用原型的原型;依次调用,直到找到实现代码,或者没有找到报错。
        实例化一个对象时,实例化对象的__proto__会指向构造函数的Test.prototype(原型对象)。本身构造函数的prototype也会指向自己的原型对象。原型对象里面也有__proto__属性,指向其他的原型对象,所以会形成原型链。

prototype

检测

test

所有内置对象都是Function对象的实例:
Number.__proto__ === Function.prototype
Boolean.__proto__=== Function.prototype
String.__proto__=== Function.prototype
Object.__proto__ === Function.prototype
Function.__proto__=== Function.prototype
Array.__proto__=== Function.prototype
RegExp.__proto__ === Function.prototype
Error.__proto__ === Function.prototype
Date.__proto__=== Function.prototype

内置对象

原创粉丝点击