二:JS基础知识——原型和原型链
2019-01-21 02:11
260 查看
原型和原型链
题目:如何准确判断一个变量是数组类型
题目:写一个原型链继承的例子
题目:描述new一个对象的过程
题目:zepto(或其他框架)源码中如何使用原型链
知识点
- 构造函数
[code]function Foo(name, age){ //构造函数名字的首字母一定是大写 this.name = name this.age = age this.class = 'class-1' //return this //默认有这行,不写会默认有这行 // } var f = new Foo('zhangsan', 20) //new 过程如下 //在new的第一时间,this变为空对象 //然后this.xxx再一次被赋值 //this.xxx赋值完之后,返回this,返回给f。 //var f1 = new Foo('lisi', 22) //创建多个对象
- 构造函数 - 扩展
var a = {} 其实是 var a = new Object() 的语法糖
var a = [] 其实是 var a = new Array()的语法糖
function Foo(){...} 其实是var Foo = new Function(...)
使用instanceof判读一个函数是否是一个变量的构造函数。(判断一个变量是否为数组:变量名 instanceof Array)
- 原型规则和示例
原型规则是学习原型链的基础,以下5条原型规则
①所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了 “null” 意外)
[code]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__属性(隐式原型),属性值是一个普通的对象
[code]console.log(obj.__proto__); console.log(arr.__proto__); console.log(fn.__proto__);
③所有的函数,都有一个prototype属性(显式原型),属性值也是一个普通的对象。
[code]console.log(fn.prototype)
④所有的引用类型(数组,对象,函数),__proto__属性值指向它的构造函数的“prototype”属性值。
[code]console.log(obj.__proto__ === Object.prototype) //===意为完全等于 //obj的隐式类型就完全等于Object的显式类型。Object为obj的构造函数。
⑤当试图得到一个对象(引用类型)的某个属性,如果这个对象本身没有这个属性,那么会去它的__proto__(即它的构造函数的prototype)中寻找。
[code]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本身没有alertName这个函数,所以去到f的构造函数Foo里寻找alertName(). //综上this都是指向自身f的 var item for (item in f){ //高级浏览器已经在 for in 中屏蔽了来自原型的属性 //但是这里还是加上了以下的判断,保证程序的健壮性 if (f.hasOwnProperty(item)){ //只有自身的属性才能进入这个判断句,原型的属性会被这个判断屏蔽掉 console.log(item) } }
- 原型链
[code]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__中查找,因为f.__proto__里没有该函数,故往上找。f.__proto__.__proto__ 即为 Object.prototype.toString,如果Object.prototype.toString()还是不存在,则往上上找Object.prototype.__proto__=null,避免了死循环。
- instanceof
作用:用于判断 引用类型属于哪一个构造函数的方法。
f instanceof Foo 的判断逻辑是:
f的__proto__一层一层往上,能否对应到Foo.prototype
f instanceof Object 因此是正确的(由原型链图可知)。
相关文章推荐
- 前端基础知识总结-原型与原型链
- 有关JS中构造函数和原型函数的一些基础知识
- js基础篇——原型与原型链的详细理解
- JS基础知识(2)-原型
- js基础知识温习:构造函数与原型
- JS原型函数相关基础知识
- 90 js 强大的原型和原型链
- H5基础知识第十二课时(JS添加CSS样式)
- 详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
- H5基础知识第八课时(JS使用方式与变量的声明)
- JS基础知识(基本类型 引用类型)
- js原型基础
- JS基础知识
- JS(十二)表单基础知识
- 原型继承基础知识总结
- js基础知识(公有方法、私有方法、特权方法)
- 【JavaWeb】基础知识总结04 JS基础
- VUE.js的基础知识
- JS中的原型及原型链的一点总结
- H5基础知识第十课时(JS函数定义和分类)