js原型链原理
先附上原型链的图,能看懂的本文就没必要看了,看不懂的可以带着疑问看文章

一、构造函数
什么是构造函数:当一个普通函数创建一个类对象是,那么就程它为构造函数。
特点:
默认首字母大写
使用new关键字来调用,并返回一个实例对象
内部使用this来构造属性和方法
this指向返回的新对象
function Person(name){
this.name = name
this.eat = function(){
console.log("方法")
}
}
let per = new Person("小小")
per.eat()
二、原型
为什么需要原型:在一些场景中,比如人类行为有些要打游戏,有些要上学,有些要工作,但同时他们都需要吃饭和睡觉,但如果把每个人吃饭睡觉私有化使用的话就有点浪费内存,这时候就可以把这些每个人都需要做的行为统一拿出来放到一个公共的空间,每个人都有权限访问它,这样就可以节省内存。而实现共享的,这个时候就用到了原型 prototype。
什么是原型:每个函数对象都有一个prototype属性,这个属性的指向被称为该函数对象的原型对象,简称原型。
function Person(name){
this.name = name
// this.eat = function(){
// console.log("饭")
// }
}
Person.prototype={
constructor:Person, //修改constructor的指向
eat:function(){
console.log("饭")
},
sleep:function(){
console.log("睡觉")
}
}
var per = new Person("小小")
var Per = new Person("大大")
console.log(per.eat === Per.eat) //true
以上案例我们看到Person的方法写到原型中的时候,实例化后的对象拿到的方法是共享的。
构造函数的prototype原型,实例对象可以直接访问,Person.prototype === per.__proto__
constructor是什么:
constructor 是实例对象和原型对象下的一个隐藏属性,指向构造函数
per.constructor === Person
Person.prototype.contructor === Person
三、原型链:
什么是原型链:实例对象与原型的连接关系,被称为原型链。
function Person(name){
this.name = name
}
Person.prototype={
constructor:Person,
eat:function(){
console.log("饭")
},
sleep:function(){
console.log("睡觉")
}
}
var per = new Person("小小")
console.dir(Person)
console.log(per)
console.log(per.__proto__ === Person.prototype) //true
console.log(per.__proto__.__proto__ === Person.prototype.__proto__) //true
console.log(Person.prototype.__proto__ === Object.prototype) //true
//----------------------------------------------------
console.log(Person.__proto__ === Function.prototype) //true
console.log(Person.__proto__.__proto__ === Function.prototype.__proto__) //true
console.log(Function.prototype.__proto__ === Object.prototype) //true
简单描述:
实例对象per的__proto__ 等于构造函数的prototype,per是Person的实例对象
Person.prototype原型对象的__proto__等于构造函数Object的prototype,Person.prototype是Object的实例对象
由此可见存在一个Object构造函数,同时Object也是Function的实例对象。
Object.prototype.__proto__ ===null
Object.__proto__ === Function.prototype
---------------------------------------------------------
构造函数Person是Function的实例对象
Function.prototype是Object的实例对象
4、new的原理
从上面案例中我们能看出实例对象是通过new构造函数而得到,从而建立了实例对象与原型的关系
这里我们猜想下new都做了什么?
1、接收一个函数方法体和参数
2、返回一个新对象
3、函数方法下的this指向新的对象
4、把新对象的__proto__指向构造函数的原型
简易版new
function Mynew(fn,...args){
if(typeof fn !== "function"){
throw "第一个参数必须是方法体"
}
let obj = {}
obj.__proto__ = Object.create(fn.prototype)
fn.apply(obj,args)
return obj
}
let mynew = Mynew(Person,"哈哈")
console.log(mynew.name)
mynew.sleep()
js原型链原理的更多相关文章
- JS原型链原理(链表)
任何一个对象都有一个prototype的属性,在js中可以把它记为:__proto__ 当初ECMAscript的发明者为了简化这门语言,同时又保持继承的属性,于是就设计了这个链表..在数据结 ...
- JS原型链
JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...
- 深入分析JS原型链以及为什么不能在原型链上使用对象
在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- JS原型链与继承别再被问倒了
原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
- JS 原型链图形详解
JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...
- js 原型链和继承(转)
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...
- 一张图看懂 JS 原型链
JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...
随机推荐
- 深入剖析HashMap
前言 很高兴遇见你~ HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点.本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识.需要 ...
- 两种方式简单免杀ew
1.资源操作法 使用工具: Restorator 2018 BeCyIconGrabber 首先我们从github下载ew使用360进行查杀 打开Restorator 将ew拖入,右键添加资源 选择图 ...
- box-sizing什么时候用?常用的值都有什么?
一般在做自适应的网页设计的时候用,用这个属性网页结构才不会被破坏. 常用的值: 1. content-box:宽度和高度分别应用到元素的内容框,在宽度和高度之外绘制元素的内边距和边框. 2. bo ...
- rabbitmq3.6.6安装,环境centos7
一,需求描述 在centos7上安装rabbitmq3.6.6 附上安装脚本 ,附上官网地址 http://www.rabbitmq.com/ ,从这上面可以下载rabbitmq-server-3.6 ...
- git 上传 + 分支
Git 上传 创建本地文件夹,更改为项目仓库(test) (1) 新建文件夹 test (2) 打开文件夹 git init 把项目添加到仓库内(test) (1) 复制项目到文件夹内 ( ...
- Eureka部署在阿里云所带来的问题
没有那么多废话,直奔主题... 1.解决查看eureka界面时服务名显示而非ip+端口,以及解决显示ip而非阿里云公网ip问题(个人解决方式,如果和我这样配置还是不行,那就再百度或者谷歌下吧) eur ...
- EF生成模型时Disigner中无信息
原博文 http://blog.sina.com.cn/s/blog_a1b63a730101ezs4.html 说明 DbContext是对ObjectContext的简化封装.原来的ObjectC ...
- IIS重写2.0 IIS伪静态 下载地址
IIS重写2.0 IIS伪静态 下载地址 https://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads Downloa ...
- H3C路由器配置——静态路由
一.网络畅通条件及排错思路 1.网络畅通的条件 网络畅通的条件:数据包能去能回,也是我们排除网络故障的理论依据. 2.网络不畅通示列 ①.目标主机不可达 原因分析:可能是数据包没有到达目的地,在中途就 ...
- (十一)、head--查看文件前若干部分,tail--查看文件后若干部分
一.命令描述与格式 head用于查看文件前面部分,tail用于查看文件的末尾部分 格式:head/tail [-选项] 文件 head选项: -c:处理文件若干字节数,加b.k.m -n:前 ...