商城成品网站,百度广告推广价格,无棣网站定制,网站建设.pdf百度云JavaScript是一种基于原型的语言#xff0c;它的每个对象都拥有一个原型对象。当试图访问一个对象的属性时#xff0c;不仅仅会在该对象上搜寻#xff0c;还会搜寻该对象的原型#xff0c;以及该对象的原型的原型。依次层层向上搜索#xff0c;直到找到一个名字匹配的属性…JavaScript是一种基于原型的语言它的每个对象都拥有一个原型对象。当试图访问一个对象的属性时不仅仅会在该对象上搜寻还会搜寻该对象的原型以及该对象的原型的原型。依次层层向上搜索直到找到一个名字匹配的属性或到达原型链的末尾。这些属性和方法就定义在Object的构造函数上的prototype属性上并不是再实列对象的本身。
原型
函数可以有属性每个函数都有一个特殊的属性prototype原型看下面的一个列子 function doSomething(){console.log(do something);}console.log(doSomething.prototype)
运行结果是
可以看到这个原型对象本身也有一个constructor属性它指向doSomething函数本身这允许通过实例访问到其构造函数。此外这个原型对象还继承自Object.prototype这意味着它可以通过[[Prototype]]链访问到Object.prototype上的所有属性和方法如hasOwnProperty, isPrototypeOf, toString等。
原型链
原型链是JavaScript中实现继承的一种机制。在JavaScript中每个对象都有一个指向另一个对象的内部链接这个被链接的对象称为原型prototype而这个链接则被称为对象的[[Prototype]]。当尝试访问一个对象的属性时如果该对象本身不存在此属性JavaScript引擎就会通过这个链接查找该属性直至找到该属性或到达原型链的末端即null为止。这一系列通过[[Prototype]]链接起来的对象就构成了原型链。
下面的图解更利于理解 原型链的工作原理 属性查找当你尝试访问一个对象的属性时JavaScript首先会在该对象自身查找。如果找不到它会沿着原型链向上查找直到找到该属性或者到达原型链的顶端null。 构造函数与原型每个函数都有一个prototype属性这个属性是一个对象包含可以由所有实例共享的属性和方法。当你使用构造函数创建对象时新对象的[[Prototype]]将指向构造函数的prototype属性。 继承子对象可以通过设置其[[Prototype]]为另一个对象来实现对父对象的继承。这样子对象就可以访问父对象的所有属性和方法除非这些属性和方法被子对象自己覆盖。
function Person() {this.namepeople;}Person.prototype.sayfunction(){console.log(this.namehello world);}function Man(){this.sexman;}// 设置Man的原型为PersonMan.prototypenew Person();// 修改Man的构造函数Man.prototype.constructorMan;const mannew Man();console.log(man.name);console.log(man.sex);man.say();// 查看原型链//打印 man 对象的直接原型即 Man.prototype这是一个通过 Person 构造函数创建的实例。console.log(man.__proto__);console.log(Man.prototype)//打印 Man.prototype 的原型也就是 Person.prototype。console.log(man.__proto__.__proto__);console.log(Person.prototype);//打印 Person.prototype 的原型也就是 Object.prototype。console.log(man.__proto__.__proto__.__proto__);console.log(Object.prototype);//打印 Object.prototype 的原型为 null。console.log(man.__proto__.__proto__.__proto__.__proto__); 在上面的列子中Man的原型指向了Person实列这意味着Man不仅可以访问自己的属性和方法还可以通过原型链来访问Person的的属性和方法。