1.__proto__与prototype的关系
所有对象的__proto__都指向其构造器的prototype
var a = {"test":‘mico‘,"age":"18"}; var b = function(){}; var c = new Date(); var d = /^[\d]$/; alert(a.__proto__ == Object.prototype); //true alert(b.__proto__ == Function.prototype); //true alert(c.__proto__ == Date.prototype); //true alert(d.__proto__ == RegExp.prototype); //true
我们来看这样一段代码
var Test = function(){};//构造函数 Test.prototype.say = function(){ console.log(‘saying‘); }; var t = new Test(); console.log(t); alert(t.__proto__ === Test.prototype);//true console可以看到:Test {}__proto__: Testconstructor: (){}arguments: nullcaller: nulllength: 0name: ""prototype: Test__proto__: Empty() {}<function scope>say: (){__proto__: Object
打印出来的t是这个样子的,那么__proto__是什么。每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念,当找到这个对象的构造器的里面还没有这个属性,就会返回undefined。
//原型链继承 var Base = function(){}; Base.prototype.say = function(){ alert("saying"); }; Base.prototype.getSaraly = function(){ alert("5000"); }; Base.prototype.name = "Mico"; var Ctrl = function(){}; Ctrl.prototype = new Base(); Ctrl.prototype.name = ‘敷衍啊‘; var a = new Ctrl(); console.log(a); alert(a.name); //敷衍啊 a.say(); //saying alert(a.__proto__ == Ctrl.prototype);//true alert(a.__proto__.__proto__ == Base.prototype);//true
打印出来的a是这样的
可以看出,当打印a.name的时候,直接在__proto__里面找,找到了直接返回,
当打印a.saying的时候,在__proto__里面没有找到。就会再往下一层__proto__里面找,找到了直接返回,如果找到构造器的__proto__还没找到,返回undefined。
打印
alert(a.__proto__ == Ctrl.prototype);//true
alert(a.__proto__.__proto__ == Base.prototype);//true
这就是原型链的加成原理,__proto__是作为一个私有属性,而prototype是作为一个外部接口提供使用的,可以通过prototype来改变__proto__这个属性
时间: 2024-11-03 22:20:13