原型链

对象

对象:

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原型链的看法的更多相关文章

  1. JS原型链

    JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...

  2. 深入分析JS原型链以及为什么不能在原型链上使用对象

    在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...

  3. js原型链与继承(初体验)

    js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...

  4. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  5. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  6. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

  7. 一张图看懂 JS 原型链

    JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...

  8. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  9. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

随机推荐

  1. Systemd笔记

    Systemd管理的启动脚本位于 /usr/lib/systemd/system/ 下 Systemd启动顺序约定为: 当前服务满足启动条件, 则立即创建进程进行并行启动, 启动条件指服务的依赖关系( ...

  2. Groovy sort() list

    https://www.w3cschool.cn/groovy/groovy_sort.html #Groovy sort()方法返回原始列表的排序副本. #句法List sort() #参数没有 # ...

  3. log配置文件log4j.propeties(配置保存日志文件的相对路径)

    log配置文件log4j.propeties(配置保存日志文件的相对路径) log4j.propeties文件: #日志的4种级别ERROR(错误).WARN(警告潜在的错误).INFO(粗粒度信息) ...

  4. 【KakaJSON手册】08_其他用法

    除了完成JSON和Model的转换之外,KakaJSON内部还有很多实用的功能,有些也开放为public接口了 遍历属性 struct Cat { var age: Int = 0 let name: ...

  5. 配置Pods和containers--为Containers和Pods分配内存资源

    指定内存请求和内存限制 要为容器指定内存请求,在容器的资源清单中使用resources:requests字段.要指定内存限制,使用resources:limits. memory-request-li ...

  6. c++ 二进制方式读取文件 读取特殊类型数据

    #include <iostream> #include <fstream> using namespace std; /* 二进制方式进行读写文件,可以读写 各种各样数据类型 ...

  7. ASP.NET LinqDataSource数据绑定后,遇到[MissingMethodException: 没有为该对象定义无参数的构造函数。]问题。

    问题出现的情形:LinqDataSource数据绑定到DetailsView或GridView均出错,错误如下: “/”应用程序中的服务器错误. 没有为该对象定义无参数的构造函数. 说明: 执行当前 ...

  8. Mac mysql 忘记root密码的解决方法

    1.执行命令以安全模式启动MySQL cd /usr/local/mysql/bin sudo ./mysqld_safe --skip-grant-tables 2.同上面目录下执行 '\) whe ...

  9. Java 待学习知识

    Java 工厂模式和策略模式 Java 面向对象与面向接口的设计模式 Java 六大设计原则 - 单一职责原则 设计模式之禅     大话设计模式

  10. Centos7.3之K8S安装初体验

    容器是发展趋势,所以是时候从虚拟机中脱离出来,投入到容器化的怀抱中了. 曾经试过安装k8s,都没有成功,各种乱七八糟的报错,于是一拖再拖,这次总算发现一个可以快速部署的工具,终于安装成功了. 这个k8 ...