js原型链的看法
原型链
对象
对象:
1,函数对象:由function创造出来的函数
2,普通对象:除开函数对象之外的对象,都是普通对象
即普通对象obj是构造函数Object的一个实例,因此:
obj.proto === Object.prototype
//普通对象
var obj = {}
var obj1 = new Object()
console.log(obj.__proto__ === obj1.__proto__); //true
console.log(obj.__proto__ === Object.prototype); //true
但凡通过new Function()创建 的对象都是函数对象,其他都是普通对象
注意: 所有对象都有__proto__属性,只有函数对象才有prototype属性
3,原型对象:prototype属性也叫原型对象,主要为了实现继承
指针__proto__: js中,万物皆对象!所有obj都具有proto属性(null和undefined除外),而且指向创造obj对象的函数对象(生成实例的构造函数)的prototype属性:
function Person(name) {
this.name = name;
}
function Mother() {
}
Mother.prototype = { //Mother的原型
age: 18,
home: ['家里蹲']
}
Person.prototype = new Mother() //Person的原型为Mother
Person 构造函数的原型对象 是 Mother ()。相当于原型(prototype)
是妈妈,Person现在是儿子。
let a = new Person()
let b = new Person('猪脑壳子')
console.log(a.age); // 18
console.log(b.name, b.home); //猪脑壳子 ["家里蹲"]
console.log(a.__proto__); //__proto__: age: 18 home: Array(1) 0: "家里蹲"length: 1
在a和b的实例中,__proto__属性,指向的都是它们的构造函数Person对象的prototype属性,所对应的对象也就是Mother()
一个构造函数对象的原型(prototype)
,就相当于他妈,这个构造函数对象的实例,就相当于他妈不同的孩子
,而每个实例中的__proto__属性,就指向它们共同的妈妈!也就是构造函数对象的prototype属性
当我们输入 b.name 的时候,原型链的搜索机制是先在实例中搜索相应的值
,找不到就通过它__proto__指针,在原型中找
,还找不到就再往上一级原型中搜索……一直到了原型链的终点
(就是js自带的Object,它的原型比较特殊,为null ),就是到null还没找到的话,就返回一个 undefined。
构造器constructor : 每一个对象中的constructor 属性返回创建此对象的函数对象的引用;例如:
function Cat(name,color) {
this.name = name;
this.color =color;
}
var cat1 = new Cat('小黑','白色')
console.log(cat1.constructor === Cat) //true
console.log(cat1); //Cat {name: "小黑", color: "白色"}
在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性
,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)
上面这句话有点拗口,我们「翻译」一下:A 有一个默认的 constructor 属性,这个属性是一个指针,指向 Person。即:
Person.prototype.constructor === Person
实例的构造函数属性(constructor)
指向构造函数 :person1.constructor == Person
person1 为什么有 constructor 属性?那是因为 person1 是 Person 的实例。
那 Person.prototype 为什么有 constructor 属性??同理, Person.prototype (你把它想象成 A) 也是Person 的实例。
也就是在 Person 创建的时候,创建了一个它的实例对象并赋值给它的 prototype,基本过程如下:
var A = new Person();
Person.prototype = A;
结论:原型对象(Person.prototype)是 构造函数(Person)的一个实例。
js原型链的看法的更多相关文章
- JS原型链
JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...
- 深入分析JS原型链以及为什么不能在原型链上使用对象
在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
- JS 原型链图形详解
JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- js 原型链和继承(转)
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...
- 一张图看懂 JS 原型链
JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- JS原型链与继承别再被问倒了
原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...
随机推荐
- Self-Supervised Representation Learning
Self-Supervised Representation Learning 2019-11-11 21:12:14 This blog is copied from: https://lilia ...
- Linux find命令忽略目录的查找方法
在Linux操作系统中,find命令非常强大,在文件与目录的查找方面可谓无所不至其极,如果能结合xargs命令使得,更是强大无比. 以下来看看find命令忽略目录查找的用法吧. 例1,根据文件属性查找 ...
- IfcRoot
IfcRoot is the most abstract and root class for all entity definitions that roots in the kernel or i ...
- powershell 开windows 端口
@echo off @echo 请以管理员身份运行 set /p portRemark=请输入端口备注: set /p port=请输入端口号: powershell -command "N ...
- VMware设置桥接模式(使虚拟机拥有独立IP访问外网)
1.关闭虚拟机里的系统 2.VMware主窗口 编辑---->虚拟网络编辑器 右下角----> 更改设置---->出现 桥接模式 桥接到:看本机所连接的网络, 网络属性中有一项“描 ...
- [PHP] 浅谈 Laravel Authentication 的 auth:api
auth:api 在 Laravel 的 Routing , Middleware , API Authentication 主题中都有出现. 一. 在 Routing 部分可以知道 auth:api ...
- 【ARM-Linux开发】【CUDA开发】NVIDIA Jetson TX2 进阶:QtCreator安装
Here we have a short article on installing Qt Creator on the NVIDIA Jetson TX1. Looky here: Note: Th ...
- 【miscellaneous】【C/C++语言】UTF8与GBK字符编码之间的相互转换
UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 CChineseCode 一 预备知识 1,字符:字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值." ...
- odoo controller 继承
方式一: 继承基类,直接重写方法 from odoo.addons.web.controllers.main import Export class PsExport(Export): @http.r ...
- ECharts 避免变窄
var roomPercentChart = echarts.init(document.getElementById('room_percent')); function ajaxGetRoomPe ...