对js原型简单的理解和图解
对js原型简单的理解和图解
最近在努力的学习js中,今天就抽了个空把自己理解的原型,记下一下在笔记中,以后自己查看,有空在会把原型链记录一下。
1.prototype
prototype:是一个函数的属性,每个函数中都会有一个prototype属性,这个属性是一个指针,指向一个对象。
该如何查看prototype
创建一个Person函数,打开chrome里面,F12打开开发者工具在Sources,在最右边的Watch窗口 +中输入Person就可以查看Person所有的属性和方法。


prototype定义
每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型属性。
图例解释
function Person() {}
var p = new Person();
上面代码的过程中发生了什么将用下图表示

prototype作用
原型对象包含实例共享的方法和属性,这个函数用作构造函数时调用,使用new操作符调用的时候,新创建的对象会从原型对象上得到同样的属性和方法。
如何理解,下面请出__proto__来解释.
2.proto
proto:是一个对象拥有的内置属性,是js内部使用寻找原型链的属性,通过该属性可以允许使用实例对象直接访问原型。
注意,prototype是函数的内置属性,__proto__是对象的内置属性
function Person() {}
var p = new Person();
// 以前不能直接使用 p直接访问对象原型
// 现在有了 __proto__ 后
// p.__proto__ 也可以直接访问对象原型
// 那么 p.__proto__ === Person.prototype
该如何查看__proto__
同查看prototype一样,在chrome和FF中的开发者工具中查看
proto 有什么用?
- 可以访问原型
- 由于在开发中除非特殊要求, 不要使用实例去修改原型的成员. 因此属性开发时使用较少
- 但是再调试过程中非常方便, 可以轻易的访问原型进行查看成员
图例解释

3.constructor
讲到这里还缺少一个constructor
constructor:属性返回对创建此对象的函数的引用。
新增的对象默认是没有 constructor 属性
constructor其实没有什么用处,只是JavaScript语言设计的历史遗留物。
由于constructor属性是可以变更的,所以未必真的指向对象的构造函数,只是一个提示。
不过,从编程习惯上,我们应该尽量让对象的constructor指向其构造函数,以维持这个惯例。
图例解释

4总结
function Student(name,age){
this.name=name;
this.age=age;
}
Student.prototype={
sayHellow:function(){
console.log("你好")
}
}
var p =new Student("张三",19);
p.sayHellow();
1.首先,预解析过程,声明构造函数Student,同是创建Student的原型Student.prototype;
2.创建出一个新的原型对象,修改Student的原型指向,指向新的原型,新的原型中没有constructor,旧的原型中的constructor依旧指向Student;
问题:为什么不是覆盖远来的Student.prototype,下面代码可以论证;
function Person(){};
var p1=new Person();
Person.prototype={
sayHello:function(){
console.log("你好");
}
}
var p2=new Person();
//p1还是拥有constructor,而p2的指向已经改变了并且拥有sayHello函数
3.使用new 创建构造函数的对象,然后将对象的引用交给构造函数的this.
4.在构造函数内部,利用对象的动态特效,给刚刚创建出的对象提供属性
- 构造函数在调用的时候传入参数,"张三"和19
- 然后给属性赋值
- 对象赋值完毕,然后将对象的引用赋值给p
5.执行调用方法p.sayHello
- 首相p中没有找到sayHello方法
- 然后进入新的原型对象中查看是否有sayHello方法
- 找到就调用sayHello方法
- 如果在原型中还未找到sayHello方法,会继续在上层原型中查找看是否有sayHello,如果都未查询到会返回undefined,查询到直接调用
- 在方法中打印“你好”;
- 方法调用结束
图例解释

对js原型简单的理解和图解的更多相关文章
- js原型浅谈理解
之前在学习原型(prototype)的时候,一直对原型的理解不是很清晰,只是知道每个对象都有一个原型,然后在js中万物又皆对象.在这里谈一下自己对于js原型的简单理解吧. 原型可以实现属性和方法的共享 ...
- 谈谈我对 js原型链的理解
想要学习 “原型链” 必须要认识什么是 “原型” 和 “原型链” 先理解一下普通的继承和原型的区别,下面写一段js代码来帮助理解: var Animal = function(){ // 动物抽象类 ...
- JS原型链的理解和使用(一)
一些个人的理解,不一定是对的,仅供参考. 在JS中有函数和对象两个概念,而又有一切皆对象的概念及函数也是一个对象.所以可以说函数一定可以作为一个对象,而对象不一定是一个函数. 也可以说在js中对象分为 ...
- js原型链结构理解
在一般的面向对象的语言中,都存在类(class)的概念,类就是对象的模板,对象就是类的实例. 但在js中是没有类的定义的(万物皆是对象). 题外话:但是在ES6中提供了更接近传统语言的写法,引入了C ...
- JS原型链的理解和使用(二)
根据在创建对象的时候,创建出来的对象的__proto__指向创建这个对象的函数的prototype属性. 由于在调用对象的属性或者方法的时候会首先在对象的作用域中查找指定的属性或者方法,如果未找到则会 ...
- 对JS原型的一些理解
一.首先给出一道经典的原型题目: var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = fun ...
- 分享一个关于js原型链的理解
http://www.cnblogs.com/wyaocn/p/5815761.html
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- 对于js原型和原型链继承的简单理解(第一种,原型链继承)
原型是js中的难点加重点,也是前端面试官最爱问的问题之一,因为面试官可以通过被面试者对原型的理解.来判断被面试者对js的熟悉程度. 原型的定义 Js所有的函数都有一个prototype属性,这个属性引 ...
随机推荐
- python基础===继承
编写类时,并非总是要从空白开始.如果你要编写的类是另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类的所 ...
- [How to]如何自定义plist文件和读取plist文件内容
1.简介 plist作为IOS的固化文件,就好比java中properties文件,但是在IOS中plist是可读写的. 本文将介绍自定义静态的plist文件. 2.自定义静态plist文件 右击你的 ...
- 尽量用const,enum,inline代替define
在读<Effective C++>之前,我确实不知道const,enum,inline会和define扯上什么关系,看完感觉收获很大,记录之. define: 宏定义. 在编译预处理时,对 ...
- 【Android开发日记】之基础篇(一)——TextView+SpannableStringBuilder
TextView是控件中最最基础的一个控件,也是最简单的一个控件.但如果仅此,我不会专门为TextView写一篇文章.最近发现了Android中有趣的一个类,那就是标题上写的SpannableStri ...
- find命令的基本用法
linux 中find 常用示例解析 find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression] 其实[-H] [-L] [- ...
- Java AQS学习
参考原文: Java并发之AQS详解 <Java并发编程的艺术> AQS 概述 AQS简介 AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,它是用来 ...
- hdu 3667(最小费用最大流+拆边)
Transportation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- BestCoder Round #85 前三题题解
sum Accepts: 822 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...
- mysql中的制表符替换
-- 问题重现set @v_t=' ';select hex(@v_t) -- 原因: -- ASCII格式的hex进展ox09对应char为(ht)制表tab,喔原来是有很多的制表符吧. ...
- ionic3包还原使用yarn命令执行步骤(解决ionic3懒加载报找不到 module的错误)
使用cnpm 还原ionic3.6的依赖包的时候 可以正常还原,但是使用懒加载就会报找不到 module 的错误.最简单的解决办法是删除node_modules 挂个vpn 重新执行npm insta ...