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


相关推荐

  • APAP调试代码_udp调试工具

    APAP调试代码_udp调试工具用来调试的matlab代码%————————————————————————-%As-Projective-As-PossibleImageStitchingwithMovingDLT%(PatentPending)

    2022年9月22日
    2
  • visual studio新手使用教程「建议收藏」

    visual studio新手使用教程「建议收藏」目录1.下载安装VisualStudio2.新建工程3.新建项目4.添加源文件5.编译一闪而退的问题6.使用scanf函数报错问题7.VS常用调试程序快捷键8.VS的调试窗口9.工具->选项对于刚刚接触编程的新手来说,最先需要熟练掌握的当然是语言之祖——C语言,而C语言编译器首当其冲的必然是visualstudio,小编入门使用VC6.0,…

    2022年6月15日
    58
  • centos7怎么查看ip地址

    centos7怎么查看ip地址在Linux系统下查询CentOS7的ip地址我们输入ip查询命名ipaddr也可以输入ifconfig查看ip,但此命令会出现3个条目,centos的ip地址是ens33条目中的inet值。输入命令:ipaddr注意截图处没有看到intent使用:ifconfig命令查询结果如下:发现ens33没有inet这个属性,那么就没法通过IP地址连接虚拟机。接着来查看ens33网卡的配置:先查看一下cd/etc/sysconfig/network-scripts

    2025年7月16日
    0
  • Centos7配置IP地址和DNS

    Centos7配置IP地址和DNS1.配置IP地址终端上输入ifconfig,找出网卡名称进入配置目录,找出对应网卡配置文件cd/etc/sysconfig/network-scripts/ls编辑配置文件vimifcfg-ens33修改成如下信息TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROU…

    2022年4月30日
    51
  • Apache knox_apache发生服务特定错误1

    Apache knox_apache发生服务特定错误1knox错误总结windowsbrowser有时候打不开KnoxUIhosts文件添加Knox的{{GATE_WAY}}ip的映射就可以打开界面了打开Knoxadmin_UI后显示不完全需要下载特定的js,私信我即可解决Knox配置yarnservice报错2020-03-1717:07:13,311ERRORknox.gateway(Gateway…

    2025年8月5日
    5

发表回复

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

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