再谈原型和原型链
function A(){} A.prototype.c = 2; var a = new A(); A.prototype.c = 5; alert(a.c) ? function B(){} B.prototype = {c:2}; var b = new B(); B.prototype = {c:5}; alert(b.c) 結果是上面為5,下面為2。為什么呢,我仔細思考了一下,發現其實原因很簡單。 先來看一個小例子: 為什么a.c = 5,而 b.c = 2?這個很簡單吧,不用解釋吧。 再來看開始的代碼,完全一樣的道理。 $ = A.prototype $.c = 2 a.c = $.c a.c = 2 $.c = 5 a.c = 5 ? $ = B.prototype $ = {c:2} b.c = $.c b.c = 2 $ = {c:5} b.c = 2 JS里,對象是以指針的形式進行賦值。 當我們new一個實例的時候,對象的_proto_會指向函數的prototype對象,也就是把prototype的指針賦給_proto_。 當我們修改prototype里的屬性,而不是重寫prototype,實例對象的_proto_的指針不變,函數的prototype的指針也不變。 變的只是指針指向的那個地址里的東西,所以實例對象的屬性會跟著變。 當我們重寫prototype里,prototype的指針改變,指向了另一個新的地址。 而實例對象的 _proto_的指針不會改變,依然指向之前的prototype的存放地址。 而我們修改的屬性是在新的地址里。所以實例對象的屬性不會跟著變。 That's All。
轉載于:https://www.cnblogs.com/misadancer/p/3507723.html
總結
- 上一篇: C++学习之路—继承与派生(四)拓展与总
- 下一篇: 进程环境之环境表