一、JS原型

首先要区分两个概念

1、构造函数

2、实例:由构造函数通过new方式创建出来的就是实例

    <script>
function Foo() { } var f = new Foo();
console.log(f instanceof Foo);
</script>

比如上面这段代码,f是由new Foo()出来的,那么f称为Foo的实例,Foo也称为f实例的构造函数

1、每一个函数都有一个属性 prototype,这个属性也称该函数的显示原型,prototype是一个空的object对象

2、每一个实例都有一个属性 __proto__,这个属性也称这个实例的原型对象,也称隐式原型

3、实例的原型对象(隐式原型)等于该实例构造函数的显示原型

4、所有通过new Foo()创建出来的实例的__proto__都指向Foo.prototype,所以这些实例的__proto__都是同一个原型对象

这个用上面的代码来说明的话,那就是

    <script>
function Foo() { } var f = new Foo();
var k = new Foo(); //f是Foo的实例
console.log(f instanceof Foo); //true //3、实例的原型对象(隐式原型)等于该实例构造函数的显示原型
console.log(f.__proto__ === Foo.prototype);//true //4、所有通过new Foo()创建出来的实例的__proto__都指向Foo.prototype,所以这些实例的__proto__都是同一个对象
console.log(k.__proto__ === f.__proto__);//true
</script>

  

二、原型链

当试图得到一个实例的某个属性时,如果这个实例本身没有这个属性,那么会去它的_proto_里去找。

如果它的_proto_里没有这个属性,则去它_proto__proto_中去找,这样一直往上找,就形成了一个原型链。

    <script>
function Foo() {
this.age = 12;
}
Foo.prototype.name = "werben"; var f = new Foo(); //f这个实例本身有age属性,直接读取
console.log(f.age); //output: 12 //f这个实例本身没有name属性,那么会去它的_proto_里去找, 也就是Foo.prototype中去找name
console.log(f.name); //output: werben
</script>

  

 函数本身也是一个实例,是Function这个构造函数的实例,所以函数除了拥有prototype属性之外,它本身也拥有作为实例拥有的__proto__属性。

比如下面的代码,三种定义Foo函数的方式都是等价的。其中一种方式表明Foo也是Function的一个实例

    <script>

        function Foo() {
console.log('hello world');
} var Foo = function() {
console.log('hello world');
} var Foo = new Function(
"console.log('hello world');"
); </script>

  

关于JS原型以及原型链、instanceof的一些理解的更多相关文章

  1. 总结一下js的原型和原型链

    最近学习了js的面向对象编程,原型和原型链这块是个难点,理解的不是很透彻,这里搜集了一些这方面的资料,以备复习所用 一. 原型与构造函数 Js所有的函数都有一个prototype属性,这个属性引用了一 ...

  2. JS对象、原型链

    忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...

  3. JS面向对象之原型链

      对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...

  4. Js笔记(对象,构造函数,原型,原型链,继承)及一些不熟悉的语法

    对象的特性: 1.唯一标识性,即使完全不一样的对象,内存地址也不同,所以他们不相等 2.对象具有状态,同一个对象可能处在不同状态下 3.对象具有行为,即对象的状态可能因为他的行为产生变迁 Js直到es ...

  5. JS原型、原型链、构造函数、实例与继承

    https://cloud.tencent.com/developer/article/1408283 https://cloud.tencent.com/developer/article/1195 ...

  6. JS(原型和原型链)

    (学习自慕课网<前端JavaScript 面试技巧> JS(原型和原型链) 题目1.如何准确判断一个变量是数组类型 使用 instanceof 方法 题目2.写一个原型链继承的例子 实例: ...

  7. JS基础-该如何理解原型、原型链?

    JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...

  8. 攻略前端面试官(三):JS的原型和原型链

    本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...

  9. JS中的原型链和原型的认识

    这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...

  10. 一文让你对js的原型与原型链不再害怕、迷惑

    目录 原型与原型链的详细剖析 原型 显式原型prototype 隐式原型__proto__ 显式原型prototype与隐式原型__proto__的关系 原型链(隐式原型链) 探寻原型链的尽头 完整详 ...

随机推荐

  1. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

  2. this关键字的用法小结

    1.this :指它所在函数所属对象的引用. 简单说:哪个对象调用this所在的函数,this就指哪个对象. 主要是为了区分:成员变量和局部变量 2.构造函数之间的调用用this关键字,如,this( ...

  3. 基于Ryu REST API的VLAN实现

    目录 0.预备知识 1.实验内容 2.编写脚本addflow.sh一步实现流表下发 3.使用api查看流表 4.实验结果 0.预备知识 ryu控制器的API文档:ryu.app.ofctl_rest ...

  4. javaEE项目部署方式

    1.手动部署 2.自动化部署 “自动化”的具体体现:向版本库提交新的代码后,应运服务器上自动部署

  5. 利用csv文件批量编辑更新sql

    历史表(popularity_ranking)数据中只存了用户手机号,业务需求中需要新增用户昵称字段, 这里我们用户表和popularity_ranking表在不同数据库中,有两种方法:1.编写后台服 ...

  6. https://uwsgi-docs.readthedocs.io/en/latest/Async.html

    Beware! Async modes will not speed up your app, they are aimed at improving concurrency. Do not expe ...

  7. python之Anaconda python3.7安装

    1.下载 https://www.anaconda.com/distribution/ #你会发现,使用windows下载十分慢,既然这样,为何不尝试centos(linux)安装呢?本人使用cent ...

  8. Cisco无线控制器配置

    一 组网图 System Name [Cisco_01::] ( characters max):wlc- //输入设备名称 Would you like to terminate autoinsta ...

  9. Delphi repeat Until 运用

    procedure TForm3.SpeedButton1Click(Sender: TObject); Var I:integer; begin I:=; repeat I:=I+; ; ShowM ...

  10. mudos源码分析

    错误捕捉相关的代码在simulate.c void throw_error() { )->framekind & FRAME_MASK) == FRAME_CATCH) { LONGJM ...