国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript中原型鏈存在的問題解析

2019-11-20 08:53:13
字體:
來源:轉載
供稿:網友

我們知道使用原型鏈實現繼承是一個goodway:)看個原型鏈繼承的例子。

function A () {this.abc = 44;}A.prototype.getAbc = function (){return this.abc;};function B() {}B.prototype = new A(); // B通過A的實例完成了繼承,形成了原型鏈(B的原型就是A的實例)var b = new B();b.getAbc(); 

關系如下:b(實例) ->B.prototype = new A() -> A.prototype ->Object.prototype

可是在這種看似“漂亮”的繼承方法中確存在問題。

1. 最主要的問題來自包含引用類型值的原型,我們知道共享原型是存在問題的,拋出一個例子

function Person () { }Person.prototype = {friends = ["a","b"]; }var person1 = new Person();var person2 = new Person();person1.friends.push("c");console.log(person1.friends); // "a","b","c"console.log(person2.friends); //"a","b","c" 

通過引用實例改變了原型中本來中的值,同時也影響了其他實例。(這就是為什么引用類型值要定義在構造函數中而非原型中的原因)

在原型鏈中同樣也會有同樣的情況出現:

function A () {this.numbers = [1,2,3];}function B() {}B.prototype = new A();var b = new B();var a = new A();b.numbers.push(4); b.numbers; //1234var b2 = new B(); b2.numbers; //1234a.numbers; //123 

我們看到出現了和上面一樣的情況(在通過原型來繼承時,原型實際上會變成另一個類型的實例。于是原先的實例屬性也就順理成章的變成了現在原型屬性了)。

可是我們看到A的實例a.numbers;依然是123,說明在B繼承A的實例時是復制了A實例中的所有屬性(包括prototype指針,形成原型鏈)并非引用(其實這里有疑問,是因為繼承的是A()的實例所以才不會影響A()創建其他實例的表現嗎?)。

2.在創建子類實例時,不可以在不影響所有對象實例的情況下給超類傳遞參數。

function A (light) {this.light1 = light;};function B (light) {this.light = light;};//給B賦值的同時,想給A賦值,無法實現B.prototype = new A();var C = new B(123);console.log(C.light);console.log(C.light1); 

想實現這個需要手動調用A的構造函數,會影響其他實例

function A (light) {this.light1 = light;};function B (light) {this.light = light;A.call(this,light);//手動調用A的構造方法};//給B賦值的同時,給A賦值B.prototype = new A();var C = new B(123);console.log(C.light);console.log(C.light1);

以上所述是小編給大家介紹的JavaScript中原型鏈存在的問題解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乳源| 永宁县| 阳西县| 崇左市| 北宁市| 武威市| 梅河口市| 安塞县| 磴口县| 南京市| 蕲春县| 吴川市| 连南| 石嘴山市| 贵德县| 玛沁县| 鄂伦春自治旗| 县级市| 河源市| 祁连县| 南安市| 塘沽区| 福鼎市| 东城区| 奉贤区| 云和县| 漳浦县| 永春县| 凌源市| 沧州市| 廊坊市| 色达县| 洞口县| 望奎县| 双牌县| 辽源市| 连江县| 安龙县| 美姑县| 铜鼓县| 丹阳市|