js面试题知识点全解(一原型和原型链)
1.如何准确判断一个变量是数组类型
2.写一个原型链继承的例子
3.描述new一个对象的过程
4.zepto(或其他框架)源码中如何使用原型链
知识点:
1.构造函数
2.构造函数-扩展
3.原型规则和示例
4.原型链
5.instanceof
讲解:
构造函数:一般函数为大写字母开头的都是构造函数,如下:
function Foo(name,age){
this.name=name
this.age=age
//return this
}
var f = new Foo('L',20) ; //构造函数形成实例,可以创建多个对象;f是一个空对象,原型是Foo
var a={}其实是var a=new Object()的语法糖
var a=[]其实是var a=new Array()的语法糖
function Foo(){}其实是var Foo=new Function()
instanceof用于判断引用类型属于哪个构造函数的方法
f instanceof Foo //判断f这个引用类型是否属于Foo构造函数,判断逻辑:f的_proto_一层一层往上,能否对应到Foo.prototype
判断一个变量是否为"数组":变量名 instanceof Array,如下代码:
var arr=[];
arr instanceof Array //true
typeof arr //object, typeof是无法判断是否是数组的
原型规则和示例:
1.所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了"null"对象以外)
2.所有引用类型都有一个_proto_(隐式原型)属性,属性值是一个普通的对象
3.所有函数都有一个prototype(显示原型)属性,属性值也是一个普通对象
var obj={};
obj.a=100;
function fn(){}
fn.a=100; console.log(obj._proto_); //隐式原型,都具有可扩展属性原则
console.log(fn.prototype); //显示原型
4.所有的引用类型,_proto_属性值指向它的构造函数的"prototype"属性值
console.log(obj._proto_===Object.prototype) //obj的构造函数为new Object(),所以obj的隐式原型属性就指向Object的显示原型属性
5.当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么它会去它的_proto_(即它的构造函数的prototype)中寻找
//构造函数
function Foo(name,age){
this.name = name
}
Foo.prototype.alertName= function(){
alert(this.name+"killua");
}
//创建示例
var f = new Foo("L");
f.lastName = function(){
console.log(this.name)
}
f.lastName(); //"L",自身属性
f.alertName(); //"Lkillua",原型属性
//以上函数中,f共有3个属性,f自身的属性有2个(name属性和lastName属性),还有一个alertName是原型属性
f.firstName();//这里f自身属性中没有firstName属性,它的原型Foo函数中也么有这个属性,所以要再往上一层Foo的原型上去找这个属性,这种有多层原型的函数就是原型链,直到null为止结束原型链
var item;
for(item in f){
// 高级浏览器已经在 for in 中屏蔽了来自原型的属性,但是这里建议加上这个判断,保证程序的健壮性
if(f.hasOwnProperty(item)){ //循环遍历f函数,如果f函数有它自身的属性item,则打印出item属性
console.log(item)
}
}
写一个原型链继承的例子:
简单易懂的例子:
function Name(){
this.name=function(){
console.log("killua")
}
}
function Firstname(){
this.firstname=function(){
console.log("L")
}
}
Name.prototype = new Firstname();
var he = new Name();
console.log(he.name); //"killua"
console.log(he.firstname); //"L"
稍复杂点的例子(建议面试用):
function 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) //addEventListener() 方法用于向指定元素添加事件句柄
}
var div1 = new Elem('div1')
//console.log(div1.html())
div1.html('<p>hello killua</p>').on('click',function(){
alert('clicked')
}).html('<p>javascript</p>')
js面试题知识点全解(一原型和原型链)的更多相关文章
- js面试题知识点全解(一原型和原型链1)
1.如何准确判断一个变量是数组类型2.写一个原型链继承的例子3.描述new一个对象的过程4.zepto(或其他框架)源码中如何使用原型链知识点:1.构造函数2.构造函数-扩展3.原型规则和示例4.原型 ...
- js面试题知识点全解(一变量类型和计算)
1.js中使用typeof能得到哪些类型 2.何时使用===和== 3.js中的内置函数 4.js变量按存储方式区分为哪些类型,并描述其特点 5.如何理解json 以下对这些问题的知识点做一些总结: ...
- js面试题知识点全解(一作用域和闭包)
问题: 1.说一下对变量提升的理解 2.说明this几种不同的使用场景 3.如何理解作用域 4.实际开发中闭包的应用 知识点: js没有块级作用域只有函数和全局作用域,如下代码: if(true){ ...
- js面试题知识点全解(一作用域)
问题: 1.说一下对变量提升的理解 2.说明this几种不同的使用场景 3.如何理解作用域 4.实际开发中闭包的应用 知识点: js没有块级作用域只有函数和全局作用域,如下代码: if(true){ ...
- js面试题知识点全解(一闭包)
闭包使用场景:1.函数作为返回值,如下场景 function F1(){ var a = 100 //自由变量 //返回一个函数(函数作为返回值) return function(){ console ...
- [转载] Python数据类型知识点全解
[转载] Python数据类型知识点全解 1.字符串 字符串常用功能 name = 'derek' print(name.capitalize()) #首字母大写 Derek print(name.c ...
- c# 实用精华知识点全解
本文介绍c#的实用知识点 写在前面(通识) vs常用快捷键 F5 调试运行程序 ctrl F5 不调试运行程序 F11 逐条语句调试 F10 逐过程调试程序 注释快捷键 ctrl + k + c 代码 ...
- JAVA笔试题(全解)
目录 一. Java基础部分................................................................. 9 1.一个".java& ...
- Js中this机制全解
JavaScript中有很多令人困惑的地方,或者叫做机制. 但是,就是这些东西让JavaScript显得那么美好而与众不同. 比方说函数也是对 象.闭包.原型链继承等等,而这其中就包括颇让人费解的th ...
随机推荐
- Mssql 跨域查询
有数据库test1和数据库test2.其中test1中有表 table1.table2:test2 中有表 table1.三个表的字段都为为:id.xingming.shijian.shuliang. ...
- 论文笔记 — MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching
论文:https://github.com/ei1994/my_reference_library/tree/master/papers 本文的贡献点如下: 1. 提出了一个新的利用深度网络架构基于p ...
- 测试通过!为何线上还有很多BUG?
质量控制 大多数测试人员认为测试工作是发现bug,虽然这是测试的主要任务,但其实测试最重要的任务是质量控制,而发现bug和验证bug只是质量控制的一个重要环节而已. 我想很多测试人员都经历过这样的场景 ...
- Python中的Unicode编码和UTF-8编码
下午看廖雪峰的Python2.7教程,看到 字符串和编码 一节,有一点感受,结合崔庆才的Python博客 ,把这种感受记录下来: ASCII码:是用一个字节(8bit, 0-255)中的127个字母表 ...
- axios 拦截 , 页面跳转, token 验证(自己摸索了一天搞出来的)
最近做项目,需要登录拦截,验证.于是使用了axios的拦截器(也是第一次使用,摸索了1天,终于搞出来了,真是太高兴啦!!!),废话不多说,直接上代码, 项目结构:vue-cli + webpack + ...
- 二维码的扫描和生成--第三方开源--ZXing
ZXing的二维码功能的提取lib下载地址:https://github.com/xuyisheng/ZXingLib 1.扫描二维码: 我们扫描就是要用到这个CaptureActivity类,直接把 ...
- 剑指offer--18.从尾到头打印链表
递归,逐个加到后面 ------------------------------------------------------------------------------ 时间限制:1秒 空间限 ...
- js 对象可枚举属性以及for in 循环和for of 循环
js中每个对象的属性(js里万物皆属性,对象的属性也是对象)都有一个属性叫enumerable(可枚举性),这个属性true/false决定了该对象的属性是否可枚举(就是让一些方法访问到这个属性). ...
- uva1152 - 4 Values whose Sum is 0(枚举,中途相遇法)
用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+ ...
- 高并发下Redis如何保持数据一致性(避免读后写)
通常意义上我们说读后写是指针对同一个数据的先读后写,且写入的值依赖于读取的值. 关于这个定义要拆成两部分来看,一:同一个数据:二:写依赖于读.(记住这个拆分,后续会用到,记为定义一.定义二)只有当这两 ...