美文网首页
js中的__proto__与prototype及原型链

js中的__proto__与prototype及原型链

作者: 牙牙and小尾巴 | 来源:发表于2019-04-29 15:52 被阅读0次

javascript中每个对象除了本身的属性外,还有一个__proto__属性,继承了父对象的方法和属性(形成原型链);而每个函数有个prototype属性,该属性值是个对象,该对象函数自定义的一些属性方法外,还有两个属性,constructor(其值一般为函数本身)和__proto__(其值继承自父对象)。

console.log(Object.__proto__==Function.prototype);//true 

Object的本质是函数对象,是通过new Function()创建,所以Object.__proto__指向Function.prototype

console.log(Function.__proto__===Function.prototype);//true

同理,Function也是函数对象,因此Function.__proto__同样指向Function.prototype

console.log(Function.prototype.__proto__==Object.prototype);//true

Function.prototype作为一个普通对象,其__proto__指向Object.prototype

console.log(Object.prototype.__proto__);//null

Object.prototype.__proto__为null,即所有对象的原型链的终点。

let Aobj=new Object();

console.log(Aobj.__proto__==Object.prototype)

可见

  1. Javascript中所有的普通对象都是Object的实例,拥有__proto__属性,继承Object.prototype的属性和方法。

2.prototype属性是一个原型对象,拥有__proto__constructor

3.Object.prototype.__proto__为null,即所有对象的原型链的终点。

console.log(Aobj.prototype);//undefined  

可见,在普通对象中没有prototype,但存在__proto__constructor

var fn = function(){} 

console.log(fn.prototype);//Object {constructor: function}

console.log(fn.__proto__);//ƒ () { [native code] }

console.log(fn.constructor);//ƒ () { [native code] }

console.log(fn.__proto__==Function.prototype)//true

可见,函数拥有prototype属性,同时函数也是一个对象,拥有__proto__constructor

下面,简单做一个示例

var Fn = function(){};
Fn.prototype.Hello = function(){
        console.log("Hello World");
    }
var f1 = new Fn();

f1.Hello();//Hello World

f1.say();//f1.say is not a function

console.log(f1.__proto__===Fn.prototype);//true

f1是Fn的实例,可以得出f1.__proto__=Fn.prototype。当我们调用f1.hello()时,首先f1中没有Hello这个属性,于是,它会到他的__proto__中去找,也就是Fn.prototype,而我们在上面定义了Fn.prototype.Hello=function(){}; 于是,就找到了对应的方法。

而我们调用f1.say()时,在f1中没有say这个属性,去f1.__proto__Fn.prototype中查找,仍然没有这个属性,去Fn.prototype的__proto__,即Object.prototype中查找,仍然没有,去Object.prototype的__proto__查找,Object.prototype.__proto__为null,即所有对象的原型链的终点。查找结束。最后返回错误。
最后 ,引入一个别人的总结

image.png

相关文章

  • JavaScript 学习

    JS 原型与原型链 每个对象都有 __proto__属性,但只有函数对象才有 prototype 属性 所有对象的...

  • JavaScript原型链

    js原型链 原型链是JS面向对象的基础非常重要 所有对象只有__proto__属性,而函数具有prototype属...

  • js基础知识(二)

    一、js原型和原型链 1、原型讲解: 普通的对象:是没有prototype属性的,只有隐藏属性__proto__,...

  • 理解prototype和__proto__以及construct

    在此例子中,对象实例a的__proto__指向其构造函数A的原型链prototype对象;js函数本身也是对象,构...

  • js中的__proto__与prototype及原型链

    javascript中每个对象除了本身的属性外,还有一个__proto__属性,继承了父对象的方法和属性(形成原型...

  • js 原型链继承__proto__、prototype简析

    js中的继承关键是靠__proto__属性实现的prototype属性的职责是将原型链中的数据放入__proto_...

  • JS原型链

    JS原型链 回顾一下类,实例,prototype,__proto__的关系 另外有: 对于p1.construcr...

  • JS原型链

    最简短精炼的JS原型链介绍:1.所有函数的__ proto__都是Function.prototype2.所有实例...

  • js面向对象

    1.函数的原型链(__ proto__,prototype,constructor ) 函数的原型(prototy...

  • js原型链中的__proto__和prototype

    在学习js原型链 的过程中,大家肯定碰到过属性__proto__和prototype,下面就举例说明下构造函数、隐...

网友评论

      本文标题:js中的__proto__与prototype及原型链

      本文链接:https://www.haomeiwen.com/subject/lenynqtx.html