前端基础之原型和原型链

本文详细探讨了JavaScript中的原型和原型链概念,包括构造函数的使用、原型规则与示例、原型链的图解以及相关试题。通过学习,你可以掌握如何判断函数是否为构造函数,理解对象的属性查找机制,以及如何实现原型链继承。同时,文章还提到了DOM查询的封装和`new`操作符的过程,以及在实际框架如Zepto中如何运用原型链。最后,给出了一个实践练习,即为数组对象添加一个原型方法以去除重复条目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、原型和原型链

1、1构造函数

function Foo(name, age){
    this.name = name
    this.age = age
    this.cklass = 'class-1'
    // return this // 默认有这行
}
var f = new Foo('zhangsan', 20)
var f1 = new Foo('lisi', 22)

1、2构造函数-扩展

function Foo{...}其实是var Foo = new Function(...)

使用instanceof判断一个函数是否是一个变量的构造函数

1、3原型规则和示例

  • 所有的引用类型(数组、对象、函数),都具有对象特性
    即可自由扩展属性(除了null以外)

  • 所有的引用类型(数组、对象、函数),都有一个__proto__(隐式原型)属性
    属性值是一个普通的对象

  • 所有的函数,都有一个prototype(显示原型)属性,属性值也是一个普通对象

  • 所有的引用类型(数组、对象、函数),都有一个__proto__(隐式原型)属性指向它的构造函数的prototype属性值

var obj = {}; obj.a = 100
var arr = []; arr.a = 100;
function fn () {}
fn.a = 100;

console.log(obj.__proto__);
console.log(arr.__proto__);
console.log(fn.__proto__);

console.log(fn.prototype)

console.log(obj.__proto__ === Object.prototype)
  • 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么回去它的__proto__(即它的构造函数的prototype中寻找)
//构造函数
function Foo (name, age) {
    this.name = name
}
Foo.prototype.alertName = function () {
    alert(this.name)
}
//创建实例
var f = new Foo('zhangsan')
f.printName = function () {
    console.log(this.name)
}
//测试
f.printName()
f.alertName()
f.toString() //要去 f.__proto__.__proto__中去找

1、4图解原型链

这里写图片描述

1、5试题

  • 如何准确判断一个变量是数组类型

    var arr = [ ]
    arr instanceof Arry //true
    typeof arr //object, typeof是无法判断是否是数组的
  • 写一个原型链继承的例子

    //动物
    function Animal() {
        this.eat = function () {
            console.log('animal eat')
        }
    }
    // 狗
    function Dog() {
        this.bark = function () {
            console.log('dog bark')
        }
    }
    Dog.prototype = new Animal()
    
    //哈士奇
    var husky = new Dog()

    封装DOM查询例子

    funcction Elem(id) {
        this.elem = document.getElementById(id)
    }
    
    Elem.prototype.html = function (val) {
        var elem = this.elem
        if (val) {
            elem.innerHTML = val
            return this //链式操作
        } else {
            return elem.innerHTML
        }
    }
    
    Elem.prototype.on = function (type, fn) {
        var elem = this.elem
        elem.addEventListener(type, fn)
        return this
    }
    
    var div1 = new Elem('detail-page')
    div1.html('<p>hello world</p>').on('click', function () {
        alert('clicked')
    }).html('<p>javascript</p>')
  • 描述new一个对象的过程

    见1.1构造函数例子

    • 创建一个对象
    • this指向这个对象
    • 执行代码,对this赋值
    • 返回this
  • zepto(或其他框架)源码中如何使用原型链

    慕课网有一个“zepto设计和源码分析”

  • 请给array本地对象增加一个原型方法,它用于删除数组条目中重复的条目

    Array.prototype.deleteRepetion = function () {
        var repetions = []
        var obj = {}
        for (let i = 0; i < this.length; i++) {
            if (obj[this[i]]) {  
                if(obj[this[i]] == 1) {  
                    repetions.push(this[i])
                    obj[this[i]]++
                    delete(this[i])
                }  
            }  
            else {  
                obj[this[i]] = 1
            }  
        }
        return repetions
    }
    var array1 = [1,2,3,4,5,1,2,3]
    console.log(array1.deleteRepetion())
<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值