这篇文章将为大家详细讲解有关JavaScript中的对象原型和原型链是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强>对象原型强>
相信大家都这样用过,<代码>地图> 代码:
让arr=(0, 1, 2) 让doubleArr=加勒比海盗。地图(c=比;c * 2) console.log (doubleArr)//0、2、4
不知道你有没有想过,arr <代码> 代码>本身并没有设定<代码> 代码>地图属性,那为什么可以用<代码> 代码>地图这个函数呢?
把它打印出来看看:
console.log (arr)//0:0//1:1//2:2//长度:3//__proto__:数组(0)
出现了一个名为<代码> __proto__> 代码的对象,如果再将其展开,就会看到所有数组对象可以使用的函数;当然我们也可以在其中找到<代码> 代码>映射函数,而这也正是例子中所调用的<代码>加勒比海盗。地图> 代码这个函数:
console.log(加勒比海盗。地图===arr.__proto__.map)//真正的
这里出现的<代码> __proto__> 代码对象,也就是所谓的<强>原型对象(原型)强>。
不同于Java、c#等<>强基于类(类)>强的面向对象语言,通过定义类,创建实例,指定继承等方式来传递属性及方法;Javascript则是个<>强基于原型(原型)的对语言>强,通过预先建立出的原型对象,当新对象建立时指定对象的原型要参照哪个原型对象。
而当我们调用对象的属性或方法时,若对象本身没有这个属性或方法,Javascript会自动寻找它原型中的方法,这也就是为什么可以直接调用<代码>加勒比海盗。地图> 代码而不会出错的原因。
<强>原型链强>
你可能已经发现在前面的例子中,<代码> __proto__> 代码对象里仍然有<代码> __proto__ 代码>属性:
console.log (arr.__proto__)//数组的原型 console.log (arr.__proto__.__proto__)//对象的原型 console.log (arr.__proto__.__proto__.__proto__)//空
在上述机制中,每当对象建立时都会绑定原型,既然对象都有原型,对象原型本身也是对象,自然也不例外,由这个例子中我们可以看出:
- <李> <代码> arr> 代码是数组实例,原型数组是李> <李> <代码>加勒比海盗。__proto__> 代码是数组的原型,原型是对象李> <李> <代码> arr.__proto__。__proto__> 代码是对象的原型,原型是零代码> <代码> 李> <李> <代码> arr.__proto__.__proto__。__proto__> 代码是空,没有任何属性李>
由于每个对象都有原型,这样就形成了一个关联一个,层层相互依赖的从属关系,我们把它们叫做<强>原型链(原型链)>强;通过这种机制,让对象得以使用原型中的属性和方法,并凭借原型链一层一层的按顺序继承,让对象能拥有原型链上所有原型的功能,这就是JavaScript对象背后的运作机制。
补充:在JavaScript中,几乎每个原型链的末端都会是对象,并最后指向到,零代码> <代码>。引用><强>使用原型强>
说了这么多,该来点代码了,接下来就来练习一下原型的建立,设定及修改吧。
先来创建一个新的对象构造函数:
函数人(名字){ this.name=名字 }Person.prototype。你好=function () { 控制台。日志(“Hello $ {this.name}”。) }让加里=新人(& # 39;加里# 39;) gary.hello()//你好Gary.Object.getPrototypeOf (gary)//{你好:?,构造函数:?}上面的例子创建了一个简单的对象构造函数<代码>人()> 代码,并在构造函数中设定对象属性。对象的方法中,由于方法不需要让每个对象都独自拥有一份,以避免造成冗余的内存消耗,应该要像前面<代码> Array.prototype。地图> 代码的例子那样把对象的方法设定给原型对象(<代码>的人。原型> 代码),让这个构造函数创建出来的对象都可以共用这些方法。最后建立一个新的人<代码> 代码>对象,并通过<代码> getPrototypeOf (obj) 代码>获取新产生对象的原型。
问:为什么不直接用<代码> __proto__ 代码>获取原型对象?
:因为虽然<代码> __proto__> 代码被几乎所有的浏览器支持,但它是非标准属性,通过<代码> getPrototypeOf> 代码取得对象的原型是正确的方法。提醒:<代码>的人。> 原型代码不是人<代码> 代码>的原型,而是构造函数执行后所建立的新对象的原型;千万不要把<强>构造函数的<代码> 代码>属原型性强>与<强>对象的原型>强搞混!
引用><强>原型继承
JavaScript中的对象原型和原型链是什么意思