javascript
JavaScript 原型链学习(二)原型的动态性
由于在原型中查找值的過程是一次搜索,因此我們對原型對象所做的任何修改都能夠立即從實(shí)例上反映出來,即使是先創(chuàng)建了實(shí)例后修改原型也照樣如此。
如下示例:
var friend = new Person(); Person.prototype.sayHi = function() {alert("hi") ; }; friend.sayHi(); // "hi"以上代碼先創(chuàng)建了Person的一個實(shí)例, 并將其保存在friend中。然后,下一條語句在Person.prototype中添加了一個方法sayHi()。即使friend實(shí)例是在添加新方法之前創(chuàng)建的,但它仍然可以訪問這個新方法。
其原因可以歸結(jié)為實(shí)例與原型之間的松散連接關(guān)系。當(dāng)我們調(diào)用friend.sayHi()時,首先會在實(shí)例中搜索名為sayHi 的屬性,在沒找到的情況下,會繼續(xù)搜索原型。因?yàn)閷?shí)例與原型之間的連接只不過是一個指針, 而非一個副本, 因此就可以在原型中找到新的sayHi屬性并返回保存在那里的函數(shù)。
盡管可以隨時為原型添加屬性和方法,并且修改能夠立即在所有對象實(shí)例中反映出來,但如果是重寫整個原型對象,那么情況就不一樣了。我們知道, 調(diào)用構(gòu)造函數(shù)時會為實(shí)例添加一個指向最初原型的[[Prototype]]指針, 而把原型修改為另外一個對象就等于切斷了構(gòu)造函數(shù)與最初原型之間的聯(lián)系。
請記住:實(shí)例中的指針僅指向原型,而不指向構(gòu)造函數(shù)??聪旅娴睦?#xff1a;
function Person(){}var friend = new Person();Person.prototype = {constructor: Person,name : "Nicholas" ,age : 29,job : "Software Engineer" ,sayName : function () {alert (this .name);} };friend.sayName(); //error在這個例子中,先創(chuàng)建了Person 的一個實(shí)例,然后又重寫了其原型對象。然后在調(diào)用friend.sayName()時發(fā)生了錯誤,因?yàn)閒riend指向的原型中不包含以該名字命名的屬性。
原因看下圖:
?
根據(jù)上圖中重寫原型對象前后的對比可以看出,重寫原型對象切斷了現(xiàn)有原型與任何之前已經(jīng)存在的對象實(shí)例之間的聯(lián)系;它們引用的仍是最初的原型。
?
轉(zhuǎn)自:https://www.cnblogs.com/weiyalin/p/9405052.html
轉(zhuǎn)載于:https://www.cnblogs.com/lishanlei/p/9452235.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript 原型链学习(二)原型的动态性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端-----盒子模型
- 下一篇: ABP框架连接Mysql数据库