您好,登錄后才能下訂單哦!
這篇文章主要介紹JavaScript面向對象的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
每一個對象都有原型,指向另一個對象,另一個對象也有自己的原型,就這樣由原型的原型構成的鏈條就叫原型鏈。
原型鏈的盡頭
如果一個原型鏈是,沒用盡頭的,那么在查找一原型鏈上不存在的屬性時,就會一直查找下去,存在死循環了。顯然不是這樣的,那么原型鏈的盡頭是什么?
看代碼~
// obj字面量創建方法類似于 new Object() // 那么 obj對象就是Object的一個實例,也就是說obj.__proto__ === Object.prototype var obj = { name: "fzb", }; // 那么obj.__proto__ 或者 Oject.prototype 的__proto__ 是什么? 答案是: null console.log(obj.__proto__); // [Object: null prototype] {} console.log(obj.__proto__.__proto__); // null
[Object: null prototype] {}
的特殊之處:
1、該對象存在原型屬性,只是原型指向了null
,就是已經是頂層原型了。
2、該對象上還存在許多其他的方法,只是不可枚舉,看不到。
上方例子的內存圖
原型鏈最頂層的原型對象就是Object的原型對象
例子:
function Student(sno, name) { this.sno = sno; this.name = name; } const stu = new Student(201801, "fzb"); console.log(stu); // Student { sno: 201801, name: 'fzb' } console.log(stu.__proto__); // {} console.log(stu.__proto__.__proto__); // [Object: null prototype] {} console.log(Student.__proto__); // {} /* ***************后面將具體講解注釋內容*************** * 為什么不是 Student.__proto__ = [Object: null prototype] {} * 是因為 Student.__proto__ = Function.prototype * Function.prototype.__proto__ = Object.prototype = [Object: null prototype] {} * ***************后面將具體講解注釋內容*************** */ console.log(Student.__proto__.__proto__); // [Object: null prototype] {}
內存圖:
繼承可以重復利用代碼,子類可以使用
例子:
function Person() { this.name = "fzb"; } Person.prototype.running = function () { console.log(this.name + "正在跑步~"); }; function Student(sno) { this.sno = sno; } Student.prototype = new Person(); // 重寫整個原型對象之后,要重新配置 constructor Object.defineProperty(Student.prototype, "constructor", { configurable: true, enumerable: false, writable: true, value: Student, }); Student.prototype.studying = function () { console.log(this.name + "正在學習"); }; const stu = new Student(201801); stu.running(); // fzb正在跑步~ stu.studying(); // fzb正在學習
內存圖:
缺陷
1> 在打印子類對象時,有些屬性本應該打印出來的,但是因為在父類上,無法打印出來。
2> 多個子類對象在進行某些操作時,會出現相互影響。
// 在上方例子上,加一點點代碼, function Person() { this.name = "fzb"; this.friends = []; // 增加一個屬性 } const stu1 = new Student(201801); stu1.friends.push("zzw"); const stu2 = new Student(201801); console.log(stu2.friends); // [ 'zzw' ] // stu2上取到了stu1的friends屬性,這是不可以的
3> 無法傳遞參數,有些屬性存在父類構造函數內,子類實例化時,初始化參數無法傳入到父類。
在子類構造函數內,調用構造函數。使改變父類構造函數內的this指向,然后父類在this上添加的屬性就會在子類實例化的對象上。
function Person(name) { this.name = name; this.friends = []; } Person.prototype.running = function () { console.log(this.name + "正在跑步~"); }; function Student(sno, name) { Person.call(this, name); // 添加代碼 this.sno = sno; } Student.prototype = new Person(); // 重寫整個原型對象之后,要重新配置 constructor Object.defineProperty(Student.prototype, "constructor", { configurable: true, enumerable: false, writable: true, value: Student, }); Student.prototype.studying = function () { console.log(this.name + "正在學習"); }; const stu1 = new Student(201801,"stu1"); stu1.friends.push("zzw"); const stu2 = new Student(201802,"stu2"); console.log(stu2.friends); // []
這時原型鏈實現繼承的三個弊端,就解決的。但是又出現了新的缺陷。
缺陷
1> 父類構造函數至少執行了兩次以上
2> 子類構造函數的原型對象是父類的實例對象,那么個對象上的屬性將會是undefined
以上是“JavaScript面向對象的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。