javascript 之 prototype与__proto__

javascript 之 prototype与__proto__

大家好,又见面了,我是全栈君。

首先,先介绍一个今天的主角:proto(隐式原型)与prototype(显式原型)

什么是__proto__和prototype?

prototype(显式原型)
在每一个函数(请注意是函数)创建之后都会有一个叫prototype的属性,这个属性指向的是函数的原型对象。

__proto__(隐式原型)
javascript 中任意对象都具有一个内置属性,在ES5之前并没有标准的方法访问这个属性,但是在绝大多数浏览器中都支持通过__proto__来访问这个属性,我们叫他隐式原型

prototype 和 __proto__之间的联系

首先我们来看一个例子:

 function Foo(){}

 var foo = new Foo();

 foo.__proto__ === Foo.prototype; //=>true

由上面我们可以看出函数foo的隐式原型指向其构造函数的显式原型.

通过这个我们能得出一个这样的结论么:
某对象(万物皆对象).__proto__ === 其构造函数.prototype么,
答案是否定的,我们来看以下例子:

let obj = {name: 'zarr'};
let sonObj = Object.create(obj);
console.log(sonObj.name); //=>zarr
console.log(sonObj.__proto__ === obj.prototype) //=>false
console.log(sonObj.__proto__ === obj) //=>true 

ok,我们再看一个例子

var Obj = { a: 13 };
var obj = Object.create(Obj);
console.log(obj.a); //=>13
console.log(obj.__proto__ === Obj) //=>true

var Func = function () {
    this.a = 'ds';
}

var func = Object.create(Func);
console.log(func.__proto__ === Func.prototype) //=>false
console.log(func.__proto__ === Func) //=>true
console.log(func.a) //undefined

不是说一个对象的隐式原型等于起构造函数的原型? 为什么这个时候又等于这个构造函数了?
这就要分析一下Object.create的实现了,其实实现起来也不难,大家看下面

Object.create = function(obj){
     function f() {} 
     f.prototype = obj;
     return new f();
}

这下明朗了, 通过Object.create构造出的对象其实还是new出来的对象,比如上例的var func = Object.create(Func); func.__proto__ === f.prototype === Func,
func.__proto__ === f.prototype这个还是成立的,但是由于函数f在调用完Object.create方法之后就被销毁了,所以只有func.__proto__ === Func。

ok,最后总结一下
1.对象有属性__proto__,指向该对象的构造函数的原型对象。
2.方法除了有属性__proto__,还有属性prototype,prototype指向该方法的原型对象。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107622.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月13日 下午7:00
下一篇 2022年3月13日 下午7:00


相关推荐

  • NVIC设置

    NVIC设置NVIC终端优先级分组(NestVectorInterruptControl嵌套式向量中断控制器)CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。STM32F4只是使用了其中的一部分。STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断,82个可屏蔽中断(常用)“`分组寄存器SCB->…

    2022年5月28日
    95
  • matlab中@的用法[通俗易懂]

    matlab中@的用法[通俗易懂]@是用于定义函数句柄的操作符。函数句柄既是一种变量,可以用于传参和赋值;也是可以当做函数名一样使用。举例:sin是matlab中的一个函数,但sin只是函数名,还不是函数句柄,不可以用于传参。f=@sin;这行代码定义了一个函数句柄,变量名是f。这样就可以当做参数传递了(这就是上面代码中的意义所在),而且还可以跟sin函数按相同的语法规则使用:g=f;%g也是函数句柄,其“值”和f一样…

    2022年7月17日
    17
  • Makefile经典教程(掌握这些足够)

    Makefile经典教程(掌握这些足够)makefile 很重要 nbsp nbsp nbsp 什么是 makefile 或许很多 Winodws 的程序员都不知道这个东西 因为那些 Windows 的 IDE 都为你做了这个工作 但我觉得要作一个好的和 professional 的程序员 makefile 还是要懂 这就好像现在有这么多的 HTML 的编辑器 但如果你想成为一个专业人士 你还是要了解 HTML 的标识的含义 特别在 Unix 下的软件编译 你就不能不自己写 make

    2026年3月19日
    2
  • 装系统后重启黑屏/卡LOGO,无法进入桌面界面

    装系统后重启黑屏/卡LOGO,无法进入桌面界面

    2026年3月15日
    2
  • oracle模糊批量查询,Oracle 模糊查询方法

    oracle模糊批量查询,Oracle 模糊查询方法在这个信息量剧增的时代 如何帮助用户从海量数据中检索到想要的数据 模糊查询是必不可少的 那么在 中模糊查询是如何实现的呢 一 我们可以在 where 子句中使用 like 关键字来达到 Oracle 模糊查询的效果 在 Where 子句中 可以对 datetime char varchar 字段类型的列用 Like 关键字配合通配符来实现模糊查询 以下是可使用的通配符 1 零或者多个字符 使用 有三种

    2026年3月19日
    2
  • OpenClaw实战教程系列第11篇 – Node 节点:控制手机和其他设备

    OpenClaw实战教程系列第11篇 – Node 节点:控制手机和其他设备

    2026年3月13日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号