返利网站程序,八方建设集团有限公司网站,免费软件下载网站排行,国外的网站建设说到prototype#xff0c;就不得不先说下new的过程。 我们先看看这样一段代码#xff1a; 1script typetext/javascript2 var Person function () { };3 var p new Person();4/script很简单的一段代码#xff0c;我们来看看这个new究竟做了什…说到prototype就不得不先说下new的过程。 我们先看看这样一段代码 1script typetext/javascript 2 var Person function () { }; 3 var p new Person(); 4/script 很简单的一段代码我们来看看这个new究竟做了什么我们可以把new的过程拆分成以下三步 1 var p{}; 也就是说初始化一个对象p。 2 p.__proto__Person.prototype; 3 Person.call(p);也就是说构造p也可以称之为初始化p。 关键在于第二步我们来证明一下 1script typetext/javascript 2var Person function () { }; 3var p new Person(); 4alert(p.__proto__ Person.prototype); 5/script 这段代码会返回true。说明我们步骤2的正确。 那么__proto__是什么我们在这里简单地说下。每个对象都会在其内部初始化一个属性就是__proto__当我们访问一个对象的属性 时如果这个对象内部不存在这个属性那么他就会去__proto__里找这个属性这个__proto__又会有自己的__proto__于是就这样 一直找下去也就是我们平时所说的原型链的概念。 按照标准__proto__是不对外公开的也就是说是个私有属性但是Firefox的引擎将他暴露了出来成为了一个共有的属性我们可以对外访问和设置。 好概念说清了让我们看一下下面这些代码 1script typetext/javascript 2var Person function () { }; 3 Person.prototype.Say function () { 4 alert(Person say); 5} 6var p new Person(); 7p.Say(); 8/script 这段代码很简单相信每个人都这样写过那就让我们看下为什么p可以访问Person的Say。 首先var pnew Person()可以得出p.__proto__Person.prototype。那么当我们调用p.Say()时首先p中没有Say这个属性 于是他就需要到他的__proto__中去找也就是Person.prototype而我们在上面定义了 Person.prototype.Sayfunction(){}; 于是就找到了这个方法。 好接下来让我们看个更复杂的。 01script typetext/javascript 02var Person function () { }; 03 Person.prototype.Say function () { 04 alert(Person say); 05} 06Person.prototype.Salary 50000; 07var Programmer function () { }; 08Programmer.prototype new Person(); 09Programmer.prototype.WriteCode function () { 10 alert(programmer writes code); 11}; 12Programmer.prototype.Salary 500; 13var p new Programmer(); 14p.Say(); 15p.WriteCode(); 16alert(p.Salary); 17/script 我们来做这样的推导 var pnew Programmer()可以得出p.__proto__Programmer.prototype; 而在上面我们指定了Programmer.prototypenew Person();我们来这样拆分var p1new Person();Programmer.prototypep1;那么: p1.__proto__Person.prototype; Programmer.prototype.__proto__Person.prototype; 由根据上面得到p.__proto__Programmer.prototype。可以得到p.__proto__.__proto__Person.prototype。 好算清楚了之后我们来看上面的结果,p.Say()。由于p没有Say这个属性于是去p.__proto__也就是 Programmer.prototype也就是p1中去找由于p1中也没有Say那就去p.__proto__.__proto__也就是 Person.prototype中去找于是就找到了alert(“Person say”)的方法。 其余的也都是同样的道理。 这也就是原型链的实现原理。 最后其实prototype只是一个假象他在实现原型链中只是起到了一个辅助作用换句话说他只是在new的时候有着一定的价值而原型链的本质其实在于__proto__转载于:https://www.cnblogs.com/chengjun/p/5237288.html