• 原型链


    对象的原型链

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

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

    问题:

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

    原型链的结构

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

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

    	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();
    

    什么是原型式继承

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

    这里的使用规则必须满足属性搜索原则

    函数的构造函数 Function

    在 js 中 使用 Function 可以实例化函数对象. 也就是说在 js 中函数与普通对象一样, 也是一个对象类型.
    函数是 js 中的一等公民.

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

    要解决的问题

    1. Function 如何使用
    2. Function 与函数的关系
    3. 函数的原型链结构

    函数是 Function 的实例

    语法:

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

    创建一个打印一句话的函数

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

    创建一个空函数

    	// 传统 
    	function foo () {}
    	// Function
    	var func = new Function();
    

    传入函数内一个数字, 打印该数字

    	// 传统
    	function foo ( num ) {
    		console.log( num );
    	}
    	// Function
    	var func = new Function ( "num" ,"console.log( num );" );
    	func();
    

    arguments 对象

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

    js 中函数并没有规定必须如何传参

    1. 定义函数的时候不写参数, 一样可以调用时传递参数
    2. 定义的时候写了参数, 调用的时候可以不传参
    3. 定义的时候写了一参数, 调用的时候可以随意的传递多个而参数

    在代码设计中, 如果需要函数带有任意个参数的时候, 一般就不带任何参数, 所有的 参数利用 arguments 来获取.
    一般的函数定义语法, 可以写成:

    	function foo ( /* ... */ ) {
    	}
    

    练习: 利用 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;
    	}
    

    练习: 利用 Function 写一个函数, 要求传入任意个数字 求和

    函数的原型链结构

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

    	function foo () {}
    	// 告诉解释器, 有一个对象叫 foo, 它是一个函数
    	// 相当于 new Function() 得到一个 函数对象
    
    1. 函数应该有什么属性? __proto__
    2. 函数的构造函数是什么? Function
    3. 函数应该继承自 Function.prototype
    4. Fucntion.prototype 继承自 Object.protoype
  • 相关阅读:
    MySQL-基础知识整理
    设计模式-适配器模式
    MySQL
    MySQL-5.7 填坑
    MySQL
    Oracle
    SQL 注入
    Apache JMeter
    AppScan
    DNS 搜索
  • 原文地址:https://www.cnblogs.com/jiaozhuo/p/5776093.html
Copyright © 2020-2023  润新知