zoukankan      html  css  js  c++  java
  • 原型链相关介绍

    1. Object.createde 方法

    是ES5中引入的方法,语法:

        Object.create(对象) -> 新对象
    

    功能:实现继承,创建一个 原型继承 自参数对象,但是缺点是,不能实现复用

    例如:

        var o = {
            sayHello: function () { console.log( '你好' ); }
        };
    
        var o1 = Object.create( o );
        // 创建一个新对象 o1, 该新对象的原型即 __proto__ 就是 o
    

    2. 对象的原型链

    1. 凡是对象就有原型
    2. 原型也是对象

    凡是对象就有原型,那么原型又是对象,因此凡是定义一个对象,那么就可以找到他的原型,原型还有原型, 那么如此下去,就构成一个对象的序列,称该结构为原型链

    那么,问题来了:

    1. 原型链到底什么时候是一个头
    2. 一个默认的原型链结构是怎样的
    3. 原型链结构对一直语法的修正

    2.1. 原型链的结构

    凡是使用构造函数创建出来的对象,并且没有利用赋值的方式修改原型,就说该对象保留默认的原型链

    默认的原型链结构是什么样子呢?

    例子:

        function Person() {}
        var p = new Person();
        // p 具有默认的原型链
    

    默认的原型链结构是: 当前对象 -> 构造函数.prototype -> Object.prototype ->null

    在实现继承的时候,有时候会利用替换原型链结构的方式实现原型继承,那么原型链结构就会发生改变

        function ItcastCollection () {}
        ItcastCollection.prototype = [];
        var arr = new ItcastCollection();
        // arr -> [] -> Array.prototype -> Object.prototype -> null
        // var arr = new Array();
    

    2.2. 什么是原型式继承

    所谓的原型式继承就是利用修改原型链的结构(增加一个节点,删除一个节点,修改节点中的成员), 来使得实例对象可以使用整条链中的所有成员

    这里的使用规则必须满足属性搜索原则(昨天有提到)

    2.3. 绘制原型链的结构

    举例:

    1. 绘制 {} 的原型链结构
    2. 绘制 [] 的原型链结构

    在JS中,所有的对象字面在解析以后,就是一个具体的对象了,那么可以理解为调用的对象的构造方法

    1. 例如在代码中写上 {}, 就相当于 new Object()
    2. 例如代码中有 [], 就相当于 new Array()
    3. 例如代码中有 /./, 就相当于 new RegExp( '.' )

    3. 函数的构造函数 Funtion

    在JS中使用的Funtion 可以实例化函数对象,也就是说在JS中函数与普通对象一样,也是一个对象类型。

    1. 函数是对象, 就可以使用对象的动态特性
    2. 函数是对象, 就有构造函数创建函数
    3. 函数是函数, 可以创建其他对象
    4. 函数是唯一可以限定变量作用域的结构

    3.1. 函数Function 的实例

    语法:

        new Function( arg0, arg1, arg2, ..., argN, body );
    
    1. Function中参数全部是字符串
    2. 该构造函数的作用是将 参数连接起来组成函数
      • 如果参数只有一个,那么就表示函数体
      • 如果参数有多个,那么最后一个参数表示新函数体,前面的所有参数表示新函数的参数
      • 如果没有参数,表示创建一个空函数

    例子1:创建一个打印一句话的函数

        // 传统的
        function foo () {
            console.log( '你好' );
        }
        // Function
        var func = new Function( 'console.log( "你好" );' );
        // 功能上, 这里 foo 与 func 等价
    

    例子2:利用 Function 创建一个函数, 要求允许函数调用时传入任意个数参数, 并且函数返回这些数字中最大的数字.

        function foo ( ) {
            // 所有的参数都在 arguments 中. 将其当做数组使用
            // 问题而已转换成在有一个数组中求最大值
            var args = arguments;
            var max = args[ 0 ];
            for ( var i = 1; i < args.length; i++ ) {
                if ( max < args[ i ] ) {
                    max = args[ i ];
                }
            }
            return max;
        }
    

    3.1.1. arguments 对象

    arguments 是一个伪数组对象. 它表示在函数调用的过程中传入的所有参数的集合. 在函数调用过程中没有规定参数的个数与类型, 因此函数调用就具有灵活的特性, 那么为了方便使用, 在 每一个函数调用的过程中, 函数代码体内有一个默认的对象 arguments, 它存储着实际传入的所有参数.

    4. 对象的原型链结构

    任意一个函数,都是相当于 Function 的实例,类似于{}和new Object()的关系

        function foo () {}
        // 告诉解释器, 有一个对象叫 foo, 它是一个函数
        // 相当于 new Function() 得到一个 函数对象
    
    1. 函数应该有什么属性? __proto__
    2. 函数的构造函数是什么? Function
    3. 函数应该继承自 Function.prototype
    4. Fucntion.prototype 继承自 Object.protoype

    4.1. 绘制函数的三角形结构

    1. Object 函数是 Function 的一个实例
    2. Object 作为对象是继承自 Function.prototype 的, 又 "Function.prototype" 继承自 Object.prototype
    3. Function 是自己的构造函数( * )
  • 相关阅读:
    Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
    终于有人把“TCC分布式事务”实现原理讲明白了
    Java synchronized 关键字的实现原理
    Synchronized的实现原理(汇总)
    Spring的Bean的生命周期(大众版)
    Synchronized与Lock的区别与应用场景
    Lock与synchronized 的区别
    线程的同步控制synchronized和lock的对比和区别
    lock和synchronized的同步区别与选择
    Mybatis3.x与Spring4.x整合
  • 原文地址:https://www.cnblogs.com/brightking/p/5734497.html
Copyright © 2011-2022 走看看