JS(原型链)
来源:互联网 发布:大阪 知乎 编辑:程序博客网 时间:2024/06/01 13:50
在聊原型链之前多吹几句,为啥需要对象?对象的好处?在传统的开发中(也叫面向过程)。顾名思义,面向过程是你要写所有的操作代码,在这个过程中,代码重复,一旦出错或者用户修改要求,要修改的代码就很多,后期维护人员绝对累死。
在生活中,面向过程就是,你要去买东西,你要自己亲自去买,而面向对象,就是你在家里,叫别人去买。这里的“别人”就是对象。你只知道这个对象可以给你买来东西,但买的过程,你并不需要关心。
就像JS里面经常使用的jQuery框架,其实就是各种对象封装的。使用时我们只知道这样使用可以得到什么,但是实现过程我们并不知道。
最初的js是没有类(抽象),对象(具体)这个概念,所以在有些方面和那些成熟的面向对象语言不同。JS里面用函数实现的对象,可以说函数即对象。就是为了实现功能而存在的。
在JS中我们为了区分构造函数和普通函数,习惯将构造函数的首字母大写。其实这两种没有区别,既是函数又可以实现对象。只是为了代码阅读方便。
function test() { } function Test() { } Test.prototype = {} console.log(typeof(test)) console.log(typeof(Test))
JS创建对象的过程,和原型链形成
上面图片中显示的属性都是函数自带的隐形属性。表面上是看不见,但又实际存在的。
对象创建:
function Test() { this.name = 'simon'; this.say = function() { console.log('最近迷恋上ytg的简讯小哥哥了'); }; } Test.prototype = { answer: function() { console.log('yeye'); } } var tObject = new Test(); tObject.say();
- 对象创建是从左到右的。 var tObject = new Test(); 首先会创建声明一个空对象, var tObject = null。
再实现 new Test(),此时会在堆内存开辟一片空间,为拷贝构造函数里面的属性。方法也可以叫属性,只是他可以实现某种功能而已。在JS中有万物皆对象,万物皆属性的说法。
成生一个属性proto指向类的原型。(原型链的来源)
面向对象语言里面,(new Test())实例化对象的时,一定会去调用构造函数。
原型链:
构造函数自带:prototype和__proto__
属性。两个都是存的地址。原型链的实现就是靠__proto__
。
对象分两种:函数对象和原型对象。
搜索机制:比如调用某种方法。实例化对象,先搜索自己属性是否有,有则实现代码;没有则调用自己的原型;若自己的原型有,则实现代码;没有则调用原型的原型;依次调用,直到找到实现代码,或者没有找到报错。
实例化一个对象时,实例化对象的__proto__
会指向构造函数的Test.prototype(原型对象)。本身构造函数的prototype也会指向自己的原型对象。原型对象里面也有__proto__
属性,指向其他的原型对象,所以会形成原型链。
检测
所有内置对象都是Function对象的实例:
Number.__proto__
=== Function.prototype
Boolean.__proto__
=== Function.prototype
String.__proto__
=== Function.prototype
Object.__proto__
=== Function.prototype
Function.__proto__
=== Function.prototype
Array.__proto__
=== Function.prototype
RegExp.__proto__
=== Function.prototype
Error.__proto__
=== Function.prototype
Date.__proto__
=== Function.prototype
- JS(原型链)
- JS原型、原型链
- JS-原型、原型链
- JS原型,原型链
- js原型,原型链
- JS原型+原型链
- JS原型链(补)
- js原型链(2)
- JS原型链(3)
- JS原型和原型链
- JS原型和原型链
- JS原型和原型链
- JS原型和原型链
- js 原型和原型链
- JS 原型与原型链
- JS原型和原型链
- js原型与原型链
- JS原型与原型链
- 笔记
- 路径规划问题
- 每天一个linux命令-find之xargs(6)
- 大话设计模式之适配器模式
- MOOC清华《VC++面向对象与可视化程序设计》第2章:Windows绘图-例(3)移动图形的绘制
- JS(原型链)
- 并查集奇妙应用-机房模拟赛某题-同BZOJ4569
- operator运算符的重载问题
- java 泛型
- eclipse配置server locations及工程发布后文件位置总结
- Mybatis 之 ResultSetHandler
- View中inflate方法
- Python的方法解析顺序(MRO)
- SPOJ NSUBSTR Substrings