• javascript prototype和_proto_


    一、prototype 

     我们知道,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象,而原型对象也会获得一个constructor属性,指向prototype属性所在函数的指针。

      先看一个例子:

    function Person(name, age, job){
    	this.name = name;
    	this.age = age;
    	this.job = job;
    	this.sayName = function(){
    		console.log("name:"+this.name);
    	}
    }
    var p = new Person("niulina", 24, "student");
    console.log(Person.prototype);

      结果显示为:

      从结果可以看到,Person构造函数的prototype属性指向一个被称为原型对象的对象,这个对象中有一个constructor属性,指向Person的构造函数,还有一个__proto__属性,这个在后边讨论。当然,你也可以给原型对象添加变量,函数等属性。

      

      那么这个新建的实例p与Person的原型对象或构造函数有什么关系,这就需要讲到看看实例p。

      

      从图中可以看到,实例p中的__proto__属性指向Person的原型对象。那,什么是__proto__属性呢?

    二、__proto__

      这个__proto__是一个隐藏的属性,javascript不希望开发者用到这个属性值,有的低版本浏览器甚至不支持这个属性值。当调用构造函数创建新实例后,该实例的内部就会包含__proto__指针,指向构造函数的原型对象。(是原型对象,而不是构造函数!!!)

      那Person.prototype的__proto__指向什么?从第一张图可以看到,是指向Object的原型,这个是因为继承的原因,后边再学习。

      那么上个图就会变成:

     

      那么问题又来了,__proto__属性的定义是当调用构造函数创建新实例后,该实例的内部就会包含__proto__指针,指向构造函数的原型对象。那么对象都是函数创建的,所以再看下Person构造函数和Object构造函数的__proto__属性:

    console.log(Person.__proto__ == Function.prototype);
    console.log(Object.__proto__ == Function.prototype);
    

      结果:

      

      所以上图又变为:

      

  • 相关阅读:
    第五周学习总结
    第四周学习总结
    第三周学习总结
    第二周学习总结
    读《程序是怎样跑起来的》第十二章有感
    读《程序是怎样跑起来的》第十一章有感
    读《程序是怎样跑起来的》第十章有感
    读《程序是怎样跑起来的》第九章有感
    《程序是怎样跑起来的》第九章
    《程序是怎样跑起来的》第八章
  • 原文地址:https://www.cnblogs.com/niulina/p/5708037.html
Copyright © 2020-2023  润新知