Javascript原型、构造函数、实例的关系
1. 原型、构造函数、实例的关系

原型:
- 原型通过constructor指向构造函数,原型如果是自定义对象且没有明确将constructor指向构造函数,则原型的constructor指向函数的基类Function。
- 原型通过方法isPrototypeOf检查是否和实例之间有关系;
构造函数:
- 构造函数的prototype指向原型
- 因为构造函数和原型可以生成多个实例,所以它两者不关心其所对应的实例,没有直接获取其对应实例的途径。
- 构造函数通过
instanceof查看和实例之间是否有关系。
实例
- 实例的__proto__检查指向其原型;
- 实例的constructor检查是否和构造函数有关系
- 实例通过
Object.getPrototypeOf(实例)可以查看其原型是谁 - 实例和原型的constructor都明确的指向构造函数,但原型如果是自定义对象且没有明确将constructor指向构造函数,则原型的constructor指向函数的基类Function。
2. 实例化的过程
创建一个对象
创建__proto__属性指向构造函数的prototype属性,创建constructor属性指向自己的构造函数;
将构造函数的所有私有属性方法复制到自己身上;
以下为函数实现:function Move(name) {
this.name = name
this.say = function() {
console.log('hello,say')
}
}
Move.prototype.age = 23;
let s = new Move('tt');
console.log(s);
// new关键字的函数实现
function newFunc(fn,...rest) {
let obj = {};
obj.constructor = fn;
obj.__proto__ = fn.prototype;
fn.call(obj,rest);
return obj;
} let newS = newFunc(Move, 'tt')
console.log(newS)
3. 扩展
对象两两不相等,因为他们指针所对应的实际存储位置不一致,如果一致,也是相等的。
function Move() {}
let obj = {age: 23}
Move.prototype = obj;
var m = new Move()
console.log(Move.prototype === m.__proto__) // true
console.log(Move.prototype === obj) // true
console.log(m.__proto__ === obj) // true
console.log(obj.isPrototypeOf(m)) // true
console.log(Object.getPrototypeOf(m)) // { age: 23 }
console.log(m instanceof Move) // true
Javascript原型、构造函数、实例的关系的更多相关文章
- 一句话总结JS构造函数、原型和实例的关系
"每个构造函数都有一个原型对象, 原型对象都包含一个指向构造函数的指针, 实例都包含一个指向原型对象的内部指针." --此段话摘自<JavaScript高级程序设计>. ...
- 原型,构造函数,实例,__proto__
再说说__proto__,这个孩子性格慢向,所以即使在现代浏览器广为支持得今天也不建议使用,性能特别慢,而且影响所有来自该[[prototype]]的对象.只是拿出来了解了解: 1.它是个啥? 原型对 ...
- JavaScript原型,原型链 !
js原型 问题:什么是js原型? js每声明一个function,都有prototype原型,prototype原型是函数的一个默认属性,在函数的创建过程中由js编译器自动添加. 也就是说:当生产一个 ...
- javascript——原型与原型链
一.prototype 在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象. 例如: function Person(age) { this.age = ag ...
- JavaScript 原型链学习(四)原型链的基本概念、原型链实现继承
简单回顾一下构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.那么,假如我们让原型对象等于另一个类型的实例,结果会 ...
- JavaScript原型与继承(1)
内容: 创建对象的几种模式以及创建的过程 原型链prototype的理解,以及prototype与 __proto__([[Prototype]])的关系 继承的几种实现 1.常见模式与原型链的理解 ...
- javascript原型原型链 学习随笔
理解原型和原型链.需从构造函数.__proto__属性(IE11以下这个属性是undefined,请使用chrome调试).prototype属性入手. JS内置的好多函数,这些函数又被叫做构造函数. ...
- JS 之原型,实例,构造函数之间的关系
JS是面向对象的语言,函数也是对象.下面大致介绍下实例,原型与构造函数之间的关系. 构造函数模式 function Person(name,age){ this.name = name; this.a ...
- js 原型链、构造函数、原型与实例之间的关系
面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...
随机推荐
- [Mysql]过大sql文件导入过慢问题解决
控制 MySQL 磁盘写入策略 以及 数据安全性 的两个关键参数: innodb_flush_log_at_trx_commit 和 sync_binlog 参数:innodb_flush_log_a ...
- Binary Stirling Numbers
http://poj.org/problem?id=1430 题目: 求 第二类 斯特林数 的 奇偶性 即 求 s2 ( n , m ) % 2 : 题解: https://blog.csdn.ne ...
- Redis Java连接池调研
Redis Java连接池调研 线上服务,由于压力大报错RedisTimeOut,但是需要定位到底问题出现在哪里? 查看Redis慢日志,slowlog get 发现耗时最大的也是11000us也就是 ...
- java浮点数精度问题解决方法
基础知识回顾: BigDecimal.setScale()方法用于格式化小数点setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOW ...
- vps能ping通但是ssh无法连接
一.全国ping测试网页https://tools.ipip.net/ping.php 如果100%丢包率,那么肯定被q了,如果没有,也不一定没被q,进入下一步 二.国内外端口扫描测试http://t ...
- MySQL基础入门之常用命令使用
如何启动MySql服务 /etc/init.d/mysqld start service mysqld start Centos .x 系统 sysctl start mysqld 检测端口是否运行 ...
- 动态DP教程
目录 前言 开始 更进一步 前言 最后一届NOIPTG的day2T3对于动态DP的普及起到了巨大的作用.然而我到现在还不会 开始 SP1716 GSS3 - Can you answer these ...
- Konrad and Company Evaluation
F. Konrad and Company Evaluation 参考:[codeforces 1230F]Konrad and Company Evaluation-暴力 思路:题意分析见参考博客. ...
- Ansible常用模块之命令类模块
Command模块 在远程节点上执行命令 [root@tiandong ~]# ansible all -m command -a "ls" 在远程主机上执行ls命令. [root ...
- vue + ts Vuex篇
Vuex对Typescript的支持,仍十分薄弱,官方库只是添加了一些.d.ts声明文件,并没有像vue 2.5这样内置支持. 第三方衍生库 vuex-typescript, vuex-ts-deco ...