JavaScript中原型鏈存在的問題解析
我們知道使用原型鏈實現(xiàn)繼承是一個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();
關(guān)系如下: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"
通過引用實例改變了原型中本來中的值,同時也影響了其他實例。(這就是為什么引用類型值要定義在構(gòu)造函數(shù)中而非原型中的原因)
在原型鏈中同樣也會有同樣的情況出現(xiàn):
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; //1234
var b2 = new B();
b2.numbers; //1234
a.numbers; //123
我們看到出現(xiàn)了和上面一樣的情況(在通過原型來繼承時,原型實際上會變成另一個類型的實例。于是原先的實例屬性也就順理成章的變成了現(xiàn)在原型屬性了)。
可是我們看到A的實例a.numbers;依然是123,說明在B繼承A的實例時是復(fù)制了A實例中的所有屬性(包括prototype指針,形成原型鏈)并非引用(其實這里有疑問,是因為繼承的是A()的實例所以才不會影響A()創(chuàng)建其他實例的表現(xiàn)嗎?)。
2.在創(chuàng)建子類實例時,不可以在不影響所有對象實例的情況下給超類傳遞參數(shù)。
function A (light) {
this.light1 = light;
};
function B (light) {
this.light = light;
};
//給B賦值的同時,想給A賦值,無法實現(xiàn)
B.prototype = new A();
var C = new B(123);
console.log(C.light);
console.log(C.light1);
想實現(xiàn)這個需要手動調(diào)用A的構(gòu)造函數(shù),會影響其他實例
function A (light) {
this.light1 = light;
};
function B (light) {
this.light = light;
A.call(this,light);//手動調(diào)用A的構(gòu)造方法
};
//給B賦值的同時,給A賦值
B.prototype = new A();
var C = new B(123);
console.log(C.light);
console.log(C.light1);
以上所述是小編給大家介紹的JavaScript中原型鏈存在的問題解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
基于JavaScript實現(xiàn)移動端點擊圖片查看大圖點擊大圖隱藏
最近接了個項目,項目需求是這樣的,當(dāng)點擊圖片查看圖片,再次點擊大圖被隱藏,在移動端用的比較多,因為移動端屏幕小,需要查看大圖。具體代碼實現(xiàn)過程本文給大家介紹,需要的朋友可以參考下2015-11-11
ES6 Object方法擴(kuò)展的應(yīng)用實例分析
這篇文章主要介紹了ES6 Object方法擴(kuò)展的應(yīng)用,結(jié)合實例形式總結(jié)分析了ES6針對對象方法的擴(kuò)展與優(yōu)化,需要的朋友可以參考下2019-06-06
原生js實現(xiàn)ajax請求和JSONP跨域請求操作示例
這篇文章主要介紹了原生js實現(xiàn)ajax請求和JSONP跨域請求操作,結(jié)合實例形式分析了基于原生js實現(xiàn)的ajax請求和JSONP跨域請求相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2020-03-03
超全面的JavaScript開發(fā)規(guī)范(推薦)
作為一名開發(fā)人員(WEB前端JavaScript開發(fā)),不規(guī)范的開發(fā)不僅使日后代碼維護(hù)變的困難,同時也不利于團(tuán)隊的合作,通常還會帶來代碼安全以及執(zhí)行效率上的問題。本文就主要介紹了關(guān)于Javascript的命名規(guī)范、注釋規(guī)范以及框架開發(fā)的一些問題,需要的朋友可以參考學(xué)習(xí)。2017-01-01

