关于JS原型以及原型链、instanceof的一些理解
一、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的一些理解的更多相关文章
- 总结一下js的原型和原型链
最近学习了js的面向对象编程,原型和原型链这块是个难点,理解的不是很透彻,这里搜集了一些这方面的资料,以备复习所用 一. 原型与构造函数 Js所有的函数都有一个prototype属性,这个属性引用了一 ...
- JS对象、原型链
忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...
- JS面向对象之原型链
对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...
- Js笔记(对象,构造函数,原型,原型链,继承)及一些不熟悉的语法
对象的特性: 1.唯一标识性,即使完全不一样的对象,内存地址也不同,所以他们不相等 2.对象具有状态,同一个对象可能处在不同状态下 3.对象具有行为,即对象的状态可能因为他的行为产生变迁 Js直到es ...
- JS原型、原型链、构造函数、实例与继承
https://cloud.tencent.com/developer/article/1408283 https://cloud.tencent.com/developer/article/1195 ...
- JS(原型和原型链)
(学习自慕课网<前端JavaScript 面试技巧> JS(原型和原型链) 题目1.如何准确判断一个变量是数组类型 使用 instanceof 方法 题目2.写一个原型链继承的例子 实例: ...
- JS基础-该如何理解原型、原型链?
JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...
- 攻略前端面试官(三):JS的原型和原型链
本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...
- JS中的原型链和原型的认识
这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...
- 一文让你对js的原型与原型链不再害怕、迷惑
目录 原型与原型链的详细剖析 原型 显式原型prototype 隐式原型__proto__ 显式原型prototype与隐式原型__proto__的关系 原型链(隐式原型链) 探寻原型链的尽头 完整详 ...
随机推荐
- vue中.sync修饰符,实现子组件实时更新父组件的值
vue 修饰符sync的功能是:当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定. 不过它有一个前身,先来看看.sync出现之前是如何实现的 父组件中(传递给子组件一个值:p ...
- c 语言延时函数
/*--- 等待x毫秒 ---*/ int sleep(unsigned long x) { clock_t c1 = clock(), c2; do { ) /* 错误 */ ; } while ( ...
- 浅谈 es6 箭头函数, reduce函数介绍
今天来谈一下箭头函数, es6的新特性 首先我们来看下箭头函数长什么样子, let result = (param1, param2) => param1+param2; 上述代码 按照以前书写 ...
- puppeteer学习笔记合集
官方英文版API入口(如果你英文好的话):https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md. 汉化版API入口(网上有 ...
- Installing the Solidity Compiler¶
Versioning¶ Solidity versions follow semantic versioning and in addition to releases, nightly develo ...
- Ajax提交之后,Method从POST变成GET
https://developer.aliyun.com/ask/68268?spm=a2c6h.13159736 https://blog.csdn.net/uzizi/article/detail ...
- Google Python Style Guide
https://google.github.io/styleguide/pyguide.html
- ubuntu tensorflow cpu faster-rcnn train data
(flappbird) luo@luo-All-Series:~/MyFile/tf-faster-rcnn_box$ (flappbird) luo@luo-All-Series:~/MyFile/ ...
- java+上传大文件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- JAVA 基础编程练习题28 【程序 28 排序算法】
28 [程序 28 排序算法] 题目:对 10 个数进行排序 程序分析:可以利用选择法,即从后 9 个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即 用第二个元素与后 8 个进行比较,并进 ...