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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 自学计算机能学会吗(爬虫啥意思)

    大家好,我是小林。我之前遇到一个很奇怪的读者,他的头像是电影《V字仇杀队》里的面具。感觉上去是一个黑客爱好者,不是一个好惹的家伙,小林看了瑟瑟发抖。结果,他来了这么一句,「哥哥,在吗?」我头顶瞬间冒出一万个问号,怎么跟头像冷酷的感觉完全相反。只听过有的读者叫我小林哥,但是还真没遇到过直接称呼哥哥的,能说出这个称呼的话,感觉对方年纪不大。然后,他请教我关于kaliLinux安装失败的问题要怎么解决,我没有安装过,所以我也没办法解决他的问题,就让他自己去网上搜搜看看。然后,他还是没解决,

    2022年4月13日
    29
  • 空间尺度分析图_尺度空间理论

    空间尺度分析图_尺度空间理论SIFT简介整理一下方便阅读,作者写的东西摘自论文,在此感谢xiaowei等的贡献DoG尺度空间构造(Scale-spaceextremadetection)http://blog.csdn.net/xiaowei_cqu/article/details/8067881 关键点搜索与定位(Keypointlocalization)http://blog.csdn.net/xi…

    2022年10月14日
    0
  • java responsebody_SpringBoot ResponseBody返回值处理的实现「建议收藏」

    java responsebody_SpringBoot ResponseBody返回值处理的实现「建议收藏」1.springbootresponsebody返回值中null值处理@postmapping(path=”/test”,produces=mediatype.application_json_value)publicobjecttest(){jsonobjectjsonobject=newjsonobject();jsonobject.put(“test”,”tes…

    2022年5月28日
    35
  • 查看 CUDA cudnn 版本 & 测试 cuda 和 cudnn 有效性「建议收藏」

    查看 CUDA cudnn 版本 & 测试 cuda 和 cudnn 有效性「建议收藏」https://medium.com/@changrongko/nv-how-to-check-cuda-and-cudnn-version-e05aa21daf6ccuda版本cat/usr/local/cuda/version.txtcudnn版本cat/usr/local/cuda/include/cudnn.h|grepCUDNN_MAJOR-A2

    2022年4月26日
    63
  • Stopwatch类的使用

    Stopwatch类的使用Stopwatch类提供了一种方便的机制来测量运行时间。Stopwatch使用了操作系统和硬件提供的最高分辨率机制,通常少于1毫秒(相比之下DateTime.Now和Environment.TickCount的分辨率在15毫秒左右)。要使用Stopwatch,可以调用StartNew方法。这将会实例化一个Stopwatch对象并开始计时(此外,也可以先实例化,再手动调用Start方法)。Elap…

    2022年6月23日
    54
  • java分页计算公式_java将list分页

    java分页计算公式_java将list分页1根据传入的参数计算1.1请求参数(currPage:当前页、pageSize:每页展示条数),根据这两个参数计算起始起始条数、截止条数 起始条数 firstIndex=(currPage-1)*pageSize 截止条数 lastIndex=currPage*pageSize1.2计算总页码(需获取总条数)pages=total%pageSize==0?total/pageSize:total/pageSize+1…

    2022年10月3日
    0

发表回复

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

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