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语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...
随机推荐
- AES采用CBC模式128bit加密工具类
写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...
- Deepin系统中手动开启swap的方法
Deepin系统中手动开启swap的方法 如何设置 swap(交换空间)的大小建议设置和你的实际物理内存一样大,如你的内存是8G的,则可将下面的count的值设为8192(当然这只是参考值,你可根据你 ...
- k8s记录-k8s部署参考
一.环境准备 yum -y install epel-release yum -y install wget nmap lsof iotop lrzsz ntpdate tree rm -rf /et ...
- SSAS 项目部署失败的问题
在创建SSAS项目过程中,创建数据源.数据源视图.多维数据集.纬度等一切都没有问题.但是在“进程”这一步的时候,发现总是报错,提示如下.OLE DB 错误: OLE DB 或 ODBC 错误 : 用户 ...
- 隐马尔科夫模型的Python3实现代码
下面给出计算隐马尔科夫模型的编程代码: from hmmlearn.hmm import GaussianHMM import datetime import numpy as np from mat ...
- Jsp编写的页面如何适应手机浏览器页面
经常遇到JSP网页需要适配手机设备的尺寸问题 解决: 在JSP加入<meta name="viewport" content="width=device-width ...
- ConcurrentHashMap多线程下比HashTable效率更高
HashTable使用一把锁处理并发问题,当有多个线程访问时,需要多个线程竞争一把锁,导致阻塞 ConcurrentHashMap则使用分段,相当于把一个HashMap分成多个,然后每个部分分配一把锁 ...
- 自定义注解实现简单的orm映射框架
package com.mj; import javax.xml.bind.Element; import java.lang.annotation.*; import java.lang.refle ...
- 精通react之react-router4源码分析(100代码实现router功能)
1.react-router4 是一个 react 组件 通过和 location / histroy 结合,来显示页面不同URL对应显示不同的组件 其中包含了三种路由.hash / boswer 等 ...
- ES6常用的新特性
1.Let&const <!DOCTYPE html> <html lang="en"> <head> <meta charset ...