亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一起來了解JavaScript面向對象

 更新時間:2021年09月26日 16:33:41   作者:還是不會呀  
本篇文章主要介紹了Javascript的面向對象,小編覺得這篇文章內容很不錯,需要的朋友可以看下,希望能夠給你帶來幫助

JavaScript原型鏈

每一個對象都有原型,指向另一個對象,另一個對象也有自己的原型,就這樣由原型的原型構成的鏈條就叫原型鏈。

image-20210924092335152

原型鏈的盡頭

如果一個原型鏈是,沒用盡頭的,那么在查找一原型鏈上不存在的屬性時,就會一直查找下去,存在死循環(huán)了。顯然不是這樣的,那么原型鏈的盡頭是什么?

Object的原型

頂層原型

看代碼~

// obj字面量創(chuàng)建方法類似于 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、該對象上還存在許多其他的方法,只是不可枚舉,看不到。

創(chuàng)建Object對象的內存圖

image-20210924094822274

上方例子的內存圖

image-20210924095218150

Object是所有類的父類

原型鏈最頂層的原型對象就是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] {}

內存圖:

image-20210924101359674

原型鏈實現繼承

繼承可以重復利用代碼,子類可以使用

例子:

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正在學習

內存圖:

image-20210924105330732

缺陷

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> 父類構造函數至少執(zhí)行了兩次以上

2> 子類構造函數的原型對象是父類的實例對象,那么個對象上的屬性將會是undefined

image-20210924111324798

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • request請求獲取參數的實現方法(post和get兩種方式)

    request請求獲取參數的實現方法(post和get兩種方式)

    下面小編就為大家?guī)硪黄猺equest請求獲取參數的實現方法(post和get兩種方式)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • javascript parseUrl函數(來自國外的獲取網址url參數)

    javascript parseUrl函數(來自國外的獲取網址url參數)

    在外國一博客看到一個很好的函數,獲取網址url等地址參數。非常不錯,值得參考與收藏。
    2010-06-06
  • 基于JavaScript實現在線網頁煙花效果

    基于JavaScript實現在線網頁煙花效果

    這篇文章主要為大家詳細介紹了如何利用JavaScript實現簡單的在線網頁煙花效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02
  • 詳解照片瀑布流效果(js,jquery分別實現與知識點總結)

    詳解照片瀑布流效果(js,jquery分別實現與知識點總結)

    本篇文章主要介紹了照片瀑布流效果,實現圖片自動加載的瀑布流效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • 微信小程序wx.getImageInfo()如何獲取圖片信息

    微信小程序wx.getImageInfo()如何獲取圖片信息

    這篇文章主要為大家詳細介紹了微信小程序wx.getImageInfo()如何獲取圖片信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 關于動態(tài)執(zhí)行代碼(js的Eval)實例詳解

    關于動態(tài)執(zhí)行代碼(js的Eval)實例詳解

    下面小編就為大家?guī)硪黄P于動態(tài)執(zhí)行代碼(js的Eval)實例詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 深入淺出JavaScript前端中的設計模式

    深入淺出JavaScript前端中的設計模式

    這篇文章主要介紹了JavaScript前端中的設計模式,設計模式是一套被反復使用,多數人知曉的,經過分類編目的,代碼設計經驗的總結,感興趣想要詳細了解可以參考下文
    2023-05-05
  • 小程序原生實現左滑抽屜菜單

    小程序原生實現左滑抽屜菜單

    在移動端,側滑菜單是一個很常用的組件,本文就詳細的介紹小程序原生實現左滑抽屜菜單,具有一定的參考價值,感興趣的可以了解一下
    2021-07-07
  • jQuery scrollFix滾動定位插件

    jQuery scrollFix滾動定位插件

    這篇文章主要介紹了jQuery scrollFix滾動定位插件,當用戶向上或向下滾動頁面到一定位置時,目標元素開始固定定位(position:fixed),當回滾到原位置時目標元素恢復到原狀態(tài),需要的朋友可以參考下
    2015-04-04
  • Javascript實現可旋轉的圓圈實例代碼

    Javascript實現可旋轉的圓圈實例代碼

    這篇文章主要介紹了Javascript實現可旋轉的圓圈實例代碼,可實現圓圈的旋轉與運動效果,涉及javascript動態(tài)操作頁面元素屬性及進行相應數學運算的技巧,需要的朋友可以參考下
    2015-08-08

最新評論